打字稿提取模板类型中嵌套对象的类型

Typescript extract type of nested object in template type

我有以下类型:

type field_<T> =
    {
        value: T;
        error:
            {
                error: boolean;
                message: string;
            }
        visited: boolean;
        validate: (value: T) => boolean;
    }

以及包含所有字段的表单:

interface form_model_
{
    firstName: field_<string>;
    lastName: field_<string>;
}

等..

我想以类似于以下的方式收集所有 value 字段:

type value_type<form_model_interface_> = {
    [key_ in keyof form_model_interface_]: ?*?;
}

什么可以替代 ?*? 或者有更好的方法吗?

有两个选项。

第一个 conditional types:

type field_<T> =
    {
        value: T;
        error:
        {
            error: boolean;
            message: string;
        }
        visited: boolean;
        validate: (value: T) => boolean;
    }

interface form_model_ {
    firstName: field_<string>;
    lastName: field_<string>;
}

type value_type<form_model_interface_> = {
    [key_ in keyof form_model_interface_]: form_model_interface_[key_] extends field_<any> ? form_model_interface_[key_]['value'] : never
}

// type Result = {
//     firstName: string;
//     lastName: string;
// }
type Result = value_type<form_model_>

Playground

第二个对 value_type 中的 form_model_interface_ 泛型具有适当的约束。请记住,在这种情况下,您需要将 form_model_ 定义为 type 而不是 interface 因为 type

type field_<T> =
    {
        value: T;
        error:
        {
            error: boolean;
            message: string;
        }
        visited: boolean;
        validate: (value: T) => boolean;
    }

type form_model_ = {
    firstName: field_<string>;
    lastName: field_<string>;
}

type value_type<form_model_interface_ extends Record<string, field_<any>>> = {
    [key_ in keyof form_model_interface_]: form_model_interface_[key_]['value']
}

// type Result = {
//     firstName: string;
//     lastName: string;
// }
type Result = value_type<form_model_>

Playground

请注意,打字稿中有命名约定。所有类型都应该大写和 CamelCased。所以field_应该写成Field.