![](/img/trans.png)
[英]TypeScript Conditional type extends object, available only properties
[英]Typescript conditional extends with nested object
我正在構建一個類型來檢查類類型的成員是否是 object,如果是,則必須分配特定類型。 我在下面提供了一個更具解釋性的示例。
在這里,我們將使用 class 示例。
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
成員實際上是該類型的 object 並允許這樣的事情
const example: myType<myObject> = {
parent: {
child: 0
},
name: "something"
id: "something"
但這不是因為parent?
沒有針對{[k:string]:any}
成功檢查。 這是因為parent?
是可選成員。 如果我改變parent?
parent
它按預期工作。 為了嘗試解決這個問題,我嘗試用{[Z in keyof T[K]]?: T[K][Z]}
切換{[k:string]:any}
} 但我觀察到了相同的行為。
到TS Playground的鏈接
如果我正確理解您的問題,那么您可以執行以下操作:
type MyType<T> = {
[K in keyof T]: T[K] extends {[k:string]:any} | undefined ? T[K] : "something"
}
?
賦予屬性undefined
的可能性(可選),因此您可以將{[k:string]:any}
替換為[k:string]:any} | undefined
[k:string]:any} | undefined
。
當你說這是因為parent?
是可選成員。
但是,成為可選成員意味着什么?
在 JS 中,這意味着屬性可以具有值或未定義。
在TS中,是指parent?
實際上是這樣的: {[k:string]: any} | undefined
{[k:string]: any} | undefined
下面的代碼解決了鏈接的 TS 操場上的錯誤。
type myType<T> = {
[K in keyof T]?: T[K] extends ({[k:string]: any} | undefined) ? T[K] : "something"
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.