簡體   English   中英

TypeScript映射類型:帶嵌套的標志類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM