繁体   English   中英

Typescript 模板类型中嵌套 object 的提取类型

[英]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>;
}

ETC..

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

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

什么会取代?*? 或者有没有更好的方法来 go 关于它?

有两种选择。

第一个有条件类型

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_>

操场

第二个对value_type中的form_model_interface_ generic 有适当的约束。 请记住,在这种情况下,您需要将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_>

操场

请注意,typescript 中有命名约定。 所有类型都应该大写和驼峰式。 所以field_应该写成Field

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM