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

Typescript 类型脚本:依赖于同一对象内另一个属性的属性类型,typescript,conditional-types,Typescript,Conditional Types,我有一个带有两个属性的TypeScript接口(type:string和args:object)。根据类型的不同,参数可能具有不同的属性。我需要将什么类型定义应用于args,以便编译器/自动完成程序知道args允许哪些属性 这有点类似于我在Redux中使用操作的方式,Redux中有类型和负载,在我的reducer中,编译器通过switch语句知道负载包含什么。但我不能让它和我的目标一起工作。 我在这里读了一篇很好的文章,但这篇文章描述了一个方法的问题,该方法有两个参数,它们相互依赖,但没有描述如

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

这有点类似于我在Redux中使用操作的方式,Redux中有
类型和
负载
,在我的reducer中,编译器通过switch语句知道负载包含什么。但我不能让它和我的目标一起工作。 我在这里读了一篇很好的文章,但这篇文章描述了一个方法的问题,该方法有两个参数,它们相互依赖,但没有描述如何在同一个对象中的两个属性上工作

导出接口对象{
类型:ObjectType
参数:ObjectParameters
}
export-type ObjectType=“check”|“计数器”
导出接口IPParameterScheck{
选中:布尔值
}
导出接口IPParametersCenter{
马克斯:号码
敏:号码
步骤:编号
}
export-type ObjectParameters=IPParameterScheck | IPParametersCenter

如果我有一个
IObject
并将类型设置为“check”,编译器/autocomplete应该提供
ipParameterScheck

的属性,我想你实际上想要的是一个有区别的联合<代码>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 'check' ? IParametersCheck: IParametersCounter
}
导出接口对象{
类型:T
参数:T扩展“检查”?IPParametersCheck:IPParametersCenter
}
或使用映射接口:

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

export type ObjectType = keyof ParameterMap
导出接口对象{
类型:T
参数:ParameterMap[T]
}
类型参数映射={
“检查”:IPParameterScheck
“计数器”:IPParametersCenter
}
导出类型ObjectType=keyof ParameterMap

类型
参数
之间似乎没有连接,因此我不确定您是否可以设置此限制。也许无论您在何处创建操作,都可以使用泛型类型,并将其定义为
IObject