我正在构建一个类型,用于检查类类型的成员是否是对象,如果是,则必须分配特定类型。我在下面提供了一个更具解释性的示例。
这里有我们将要使用的类示例。
declare class myObject {
name?: string
id?: number
parent?: {
child: number
}
}
这里有我想要制作的类型
type myType<T> = {
[K in keyof T]: T[K] extends {[k:string]:any} ? T[K] : "something"
}
它应该检查parent
成员实际上是该类型的对象,并允许这样的事情
const example: myType<myObject> = {
parent: {
child: 0
},
name: "something"
id: "something"
但事实并非如此,因为 parent?
未针对 {[k:string]:any}
成功检查。发生这种情况是因为 parent?
是可选成员。如果我将 parent?
更改为 parent
,它会按预期工作。为了尝试解决这个问题,我尝试将 {[k:string]:any}
与 {[Z in keyof T[K]]?: T[K][Z]}
但我观察到了同样的行为。
指向 TS Playground 的链接
最佳答案
当你说这种情况发生时,你是对的,因为 parent?
是一个可选成员。
但是成为可选成员意味着什么?
在 JS 中,这意味着属性可以有值,也可以未定义。
在TS中,这意味着parent?
的类型实际上是这样的:{[k:string]: any} |未定义
下面的代码解决了链接的 TS Playground 上的错误。
type myType<T> = {
[K in keyof T]?: T[K] extends ({[k:string]: any} | undefined) ? T[K] : "something"
}
关于Typescript 有条件扩展嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72845847/