【发布时间】:2021-11-09 18:03:51
【问题描述】:
我正在尝试创建一个泛型类型,该类型可以从潜在的嵌套对象类型中检索特定键的类型。它将接收对象和作为泛型的键。但是,该键的路径是未知的,因此它可能需要遍历每个值才能找到它。到目前为止,这是我想出的。
type GetDeepProp<T extends object, Key extends string> = Key extends keyof T
? T[Key]
: {
[k in keyof T]: T[k] extends object
? GetDeepProp<T[k], Key>
: unknown
}[keyof T]
//examples
type ShallowUser = { region: string; }
type DeepUser = { account: { region: number; } }
type DeeperUser = { account: { location: { region: "USA" | "Canada" | "France", } } }
let shallowRegion: GetDeepProp<ShallowUser, 'region'> // should return string
let deepRegion: GetDeepProp<DeepUser, 'region'> //should return number
let deeperRegion: GetDeepProp<DeeperUser, 'region'> //should return "USA" | "Canada"
在研究了一段时间后,我发现这个解决方案似乎确实有效。但我不明白为什么它会起作用。这最后一行[keyof T] create 不应该从所有键中创建所有类型的联合,而不仅仅是传入的键吗?我想我的问题是,为什么这行得通(或者它可能不成立),有没有更好的方法来完成这个?
【问题讨论】:
-
我不知道是否有其他方法可以实现这一点,但您应该使用
never而不是unknown。因为这意味着您在某处找到了region属性,但您无法确定类型。但是never类型意味着不存在的属性不能有类型。
标签: typescript typescript-typings typescript-generics