Typescript:属性的类型依赖于同一对象中的另一个属性

2023-12-13

我有一个具有两个属性的 TypeScript 接口(type:string and args:object). The args可能具有不同的属性,具体取决于type。我需要应用什么类型定义args这样编译器/自动完成就会知道允许哪些属性args?

这有点类似于我在 Redux 中使用 Actions 的方式,它确实有一个type and a payload在我的减速器中,编译器通过 switch 语句知道有效负载包含什么。但我无法让它与我的对象一起工作。 我在这里读过一篇很棒的文章https://artsy.github.io/blog/2018/11/21/conditional-types-in-typescript/但这描述了具有两个相互依赖的参数的方法的问题,但没有描述如何使其适用于同一对象中的两个属性。

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Typescript:属性的类型依赖于同一对象中的另一个属性 的相关文章

随机推荐