打字稿:重新映射值深度对象
Typescript: Remap values deep object
如何从深层对象中选取属性?似乎T[key]['default']
在映射类型中是不允许的?
type MyModule = {
title: {
default: string
},
length: {
default: number
}
}
// expected type
type NewMyModule = {
dataModel: string; // type of 'default' prop
length: number; // type of 'default' prop
}
// error message: 'default' can't be used to index type 'T[key]'
type PickDefault<T> = {
[key in keyof T]: T[key]['default']
}
Typescript 对你大喊大叫的原因是它不知道键 default
是否存在于类型 T[key]
上。您可以采用两种方法来解决此问题。第一个是限制输入类型参数 T
Typescript 知道 T[key]
的类型是什么。见下文。
type PickDefault<T extends Record<keyof any, { default: unknown }>> = {
[key in keyof T]: T[key]['default'];
}
您还可以做的是使用类型推断。见下文。
type PickDefault2<T> = {
[key in keyof T]: T[key] extends { default: infer D } ? D : never;
}
第二种方法的一个警告是,如果在 T[key]
上找不到 default
,它不会引发任何错误。相反,它只会将类型替换为 never
。而第一种方法只允许适当的类型通过。
如何从深层对象中选取属性?似乎T[key]['default']
在映射类型中是不允许的?
type MyModule = {
title: {
default: string
},
length: {
default: number
}
}
// expected type
type NewMyModule = {
dataModel: string; // type of 'default' prop
length: number; // type of 'default' prop
}
// error message: 'default' can't be used to index type 'T[key]'
type PickDefault<T> = {
[key in keyof T]: T[key]['default']
}
Typescript 对你大喊大叫的原因是它不知道键 default
是否存在于类型 T[key]
上。您可以采用两种方法来解决此问题。第一个是限制输入类型参数 T
Typescript 知道 T[key]
的类型是什么。见下文。
type PickDefault<T extends Record<keyof any, { default: unknown }>> = {
[key in keyof T]: T[key]['default'];
}
您还可以做的是使用类型推断。见下文。
type PickDefault2<T> = {
[key in keyof T]: T[key] extends { default: infer D } ? D : never;
}
第二种方法的一个警告是,如果在 T[key]
上找不到 default
,它不会引发任何错误。相反,它只会将类型替换为 never
。而第一种方法只允许适当的类型通过。