簡體   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