[英]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.