打字稿提取模板类型中嵌套对象的类型
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_>
第二个对 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_>
请注意,打字稿中有命名约定。所有类型都应该大写和 CamelCased。所以field_
应该写成Field
.
我有以下类型:
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_>
第二个对 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_>
请注意,打字稿中有命名约定。所有类型都应该大写和 CamelCased。所以field_
应该写成Field
.