[英]TypeScript mapped types: Flag type with nesting
TypeScript中是否可以創建高級類型文檔中提到的Flags
類型的嵌套版本?
這很好用:
type Flags<T> = {
[P in keyof T]: boolean;
}
interface Colors {
red: string;
green: string;
blue: string;
}
const activeColors: Flags<Colors> = {
red: true,
green: true,
blue: false
}
但是,如果我想創建一個NestedFlags
類型,該類型能夠處理這樣的嵌套對象怎么辦?
interface NestedColors {
red: string;
green: string;
blue: string;
more: {
yellow: string;
violet: string;
black: string;
}
}
const activeNestedColors: NestedFlags<NestedColors> {
red: true,
blue: false,
green: true,
more: {
yellow: false,
violet: true,
black: true
}
}
我可以使用[P in keyof T]: boolean | NestedFlags<T[P]>
創建NestedFlags
類型[P in keyof T]: boolean | NestedFlags<T[P]>
[P in keyof T]: boolean | NestedFlags<T[P]>
。 該解決方案效果很好,除了它允許我使用例如創建對象。 more: false
,這對我來說是不可取的。
謝謝!
您可能希望映射的條件類型 (將從TypeScript v2.8開始提供)在本月的某個時候(2018年3月)發布。 您現在可以通過typescript@next
使用它。 這是我如何實現的第一槍:
type NestedFlags<T> = {
[K in keyof T]: T[K] extends object ? NestedFlags<T[K]> : boolean
}
上一行使用條件類型三元類型語法。 這意味着:對於T
每個鍵, NestedFlags<T>
的屬性類型將取決於原始屬性是否為對象類型。 如果原始屬性不是對象類型,則對應的屬性將為布爾值。 如果原始屬性是對象類型,則對應的屬性將是應用於該對象類型的NestedFlags<>
。
這使您具有以下行為:
interface NestedColors {
red: string;
green: string;
blue: string;
more: {
yellow: string;
violet: string;
black: string;
}
}
// okay
const activeNestedColors: NestedFlags<NestedColors> = {
red: true,
blue: false,
green: true,
more: {
yellow: false,
violet: true,
black: true
}
}
// error
const badActiveNestedColors: NestedFlags<NestedColors> = {
red: true,
blue: false,
green: true,
more: false
}
// Types of property 'more' are incompatible.
// Type 'boolean' is not assignable to ...
TypeScript抱怨badActiveNestedColors
,說more
不應該是boolean
。
希望能有所幫助。 祝好運!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.