簡體   English   中英

打字稿:屬性的類型依賴於同一對象中的另一個屬性

[英]Typescript: Type of a property dependent on another property within the same object

我有一個帶有兩個屬性的 TypeScript 接口( type:stringargs:object )。 args可能具有不同的屬性,具體取決於type 我需要對args應用什么類型定義,以便編譯器/自動完成將知道args允許哪些屬性?

這有點類似於我在 Redux 中使用 Actions 的方式,它有一個type和一個payload ,在我的減速器中,編譯器通過 switch 語句知道有效負載包含什么。 但我不能讓它與我的對象一起工作。 我在這里閱讀了一篇很棒的文章https://artsy.github.io/blog/2018/11/21/conditional-types-in-typescript/但這描述了具有兩個相互依賴的 args 的方法的問題,但是不是如何讓這對同一對象中的兩個屬性起作用。

export interface IObject {
  type: ObjectType
  parameters: ObjectParameters
}
export type ObjectType = "check" | "counter"
export interface IParametersCheck {
  checked: boolean
}
export interface IParametersCounter {
  max: number
  min: number
  step: number
}
export type ObjectParameters = IParametersCheck | IParametersCounter

如果我有一個IObject並將類型設置為“檢查”,編譯器/自動完成應該提供IParametersCheck的屬性。

我認為您實際上正在尋找的是一個受歧視的工會。 IObject本身應該是一個聯合:

export type IObject = {
    type: "checked"
    parameters: IParametersCheck
} | {
    type: "counter"
    parameters: IParametersCounter
}
export type ObjectType = IObject['type'] //// in case you need this union
export type ObjectParameters = IObject['parameters']  //// in case you need this union

export interface IParametersCheck {
    checked: boolean
}
export interface IParametersCounter {
    max: number
    min: number
    step: number
}

你也可以用條件類型來做,但我認為聯合解決方案效果更好:

export interface IObject<T extends ObjectType> {
    type: T
    parameters: T extends 'checked' ? IParametersCheck: IParametersCounter
}

或者使用映射接口:

export interface IObject<T extends ObjectType> {
    type: T
    parameters: ParameterMap[T]
}
type ParameterMap ={
    'checked': IParametersCheck
    'counter': IParametersCounter
}

export type ObjectType = keyof ParameterMap

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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