首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Typescript:依赖于同一对象中另一个属性的属性类型

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

Stack Overflow用户
提问于 2019-07-09 17:31:24
回答 1查看 12.9K关注 0票数 34

我有一个具有两个属性(type:stringargs:object)的TypeScript接口。根据type的不同,args可能具有不同的属性。我需要将什么类型定义应用于args,以便编译器/自动完成功能知道哪些属性是允许用于args

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

代码语言:javascript
复制
export interface IObject {
  type: ObjectType
  parameters: ObjectParameters
}
代码语言:javascript
复制
export type ObjectType = "check" | "counter"
代码语言:javascript
复制
export interface IParametersCheck {
  checked: boolean
}
代码语言:javascript
复制
export interface IParametersCounter {
  max: number
  min: number
  step: number
}
代码语言:javascript
复制
export type ObjectParameters = IParametersCheck | IParametersCounter

如果我有一个IObject,并将类型设置为"check“,编译器/autocomplete应该提供IParametersCheck的属性。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-09 18:19:25

我认为你实际上在寻找的是一个受歧视的联盟。IObject本身应该是一个联盟:

代码语言:javascript
复制
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
}

你也可以使用条件类型,但我认为联合解决方案效果更好:

代码语言:javascript
复制
export interface IObject<T extends ObjectType> {
    type: T
    parameters: T extends 'checked' ? IParametersCheck: IParametersCounter
}

或者使用映射接口:

代码语言:javascript
复制
export interface IObject<T extends ObjectType> {
    type: T
    parameters: ParameterMap[T]
}
type ParameterMap ={
    'checked': IParametersCheck
    'counter': IParametersCounter
}

export type ObjectType = keyof ParameterMap
票数 49
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56949513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档