我有一个具有两个属性(type:string
和args:object
)的TypeScript接口。根据type
的不同,args
可能具有不同的属性。我需要将什么类型定义应用于args
,以便编译器/自动完成功能知道哪些属性是允许用于args
的
这有点类似于我在Redux中使用Actions的方式,它确实有一个type
和一个payload
,并且在我的reducer中,编译器通过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
,并将类型设置为"check“,编译器/autocomplete应该提供IParametersCheck
的属性。
发布于 2019-07-09 18:19:25
我认为你实际上在寻找的是一个受歧视的联盟。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
https://stackoverflow.com/questions/56949513
复制相似问题