Typescript Mixin类型模式不工作

Typescript Mixin类型模式不工作,typescript,Typescript,我正在为AWS的Step函数配置和函数可以组成的各种“状态”创建一个类型,包括:{ export type StepFunctionState = IStepFunctionTask & IStepFunctionChoice & IStepFunctionWait; 我正在使用“mixin”模式,以便状态可以是不同类型状态的任意组合。各种状态定义如下: export interface IStepFunctionTask extends IStepFunc

我正在为AWS的Step函数配置和函数可以组成的各种“状态”创建一个类型,包括:{

export type StepFunctionState = IStepFunctionTask 
    & IStepFunctionChoice 
    & IStepFunctionWait;
我正在使用“mixin”模式,以便状态可以是不同类型状态的任意组合。各种状态定义如下:

export interface IStepFunctionTask extends IStepFunctionBaseState {
  Type: "Task";
  /** of the format arn:aws:lambda:#{AWS::Region}:#{AWS::AccountId}:function:${self:service}-${opt:stage}-FUNCTION_NAME */
  Resource: AwsFunctionArn;
  Next?: string;
  End?: true;
  Retry?: [
    {
      ErrorEquals: string[];
      IntervalSeconds: number;
      BackoffRate: number;
      MaxAttemps: number;
    }
  ];
  Catch?: [
    {
      ErrorEquals: string[];
      Next: string;
    }
  ];
}

export interface IStepFunctionChoice extends IStepFunctionBaseState {
  Type: "Choice";
  Choices: [
    {
      /** points to the specific area of context which is being evaluated in the choice */
      Variable: string;
      /** compare the value passed in -- and scoped by "Variable" -- to be numerically equal to a stated number */
      NumericEquals?: number;
      /** the next state to move to when completed with this one */
      Next?: string;
      /** the step-function should stop at this step */
      End?: boolean;
    }
  ];
}

export interface IStepFunctionWait extends IStepFunctionBaseState {
  Type: "Wait";
  Seconds: number;
  Next: AwsFunctionArn;
}
其中,
IStepFunctionBaseState
只是加强了所需的
类型
属性,该属性是区分联合的关键部分:

导出接口IDictionary{ [键:字符串]:T; } 导出类型IStepFunctionType=“任务”|“等待”|“选择”; 导出接口IStepFunctionBaseState{ 类型:IStepFunctionType; } 然后,我可以为每种任务类型分配合理的数据结构:

const wait: IDictionary<IStepFunctionWait> = {
  yyy: {
    Type: "Wait",
    Seconds: 12,
    Next: "foo"
  }
};

const task: IDictionary<IStepFunctionTask> = {
  xxx: {
    Type: "Task",
    Resource: "arn",
    Next: "x2"
  },
  x2: {
    Type: "Task",
    Resource: "arn2",
    End: true
  }
};

const pass: IDictionary<IStepFunctionPass> = {
  pass: {
    Type: "Pass",
    Result: {
      foo: 1,
      bar: 2
    },
    ResultPath: "$.info",
    Next: "baz"
  }
};

const choice: IDictionary<IStepFunctionChoice> = {
  zzz: {
    Type: "Choice",
    Choices: [
      {
        Variable: "$.bar",
        NumericEquals: 1,
        Next: "xxx"
      }
    ]
  }
};
const wait:IDictionary={
yyy:{
键入:“等待”,
秒:12,
下一个:“福”
}
};
常量任务:IDictionary={
xxx:{
键入:“任务”,
资源:“arn”,
下一步:“x2”
},
x2:{
键入:“任务”,
资源:“arn2”,
完:对
}
};
常量通行证:IDictionary={
通过:{
键入:“通过”,
结果:{
傅:1,,
酒吧:2间
},
结果路径:“$.info”,
下一个:“baz”
}
};
常量选项:IDictionary={
zzz:{
键入:“选择”,
选择:[
{
变量:“$.bar”,
数字质量:1,
下一步:“xxx”
}
]
}
};
这一切都有效,但不起作用的是:

const mixedBag: IDictionary<StepFunctionState> = {
  ...task,
  ...choice,
  ...wait
};
const mixedBag:IDictionary={
任务
…选择,
等待
};
我在
mixedBag
的定义中发现了一些错误,它抱怨:

类型“{Type:“Task”;资源:string;Next?:string;End?:true;Retry?:[{ErrorEquals:string[];In…”不可分配给类型“{Type:“Task”;资源:string;Next?:string;End?:true;Retry?:[{ErrorEquals:string[];In…”。存在两种具有此名称的不同类型,但它们不相关

以及

类型“{type:“Choice”;选项:[{Variable:string;NumericEquals?:number;Next?:string;End?:bool…”中缺少属性“Resource”

希望这足以让人们提供帮助,但如果您需要更多帮助,请告诉我。

问题是,当您希望对象具有联合中的所有属性时,将使用这些上下文(因此所有步骤都将同时具有
IStepFunctionTask
IStepFunctionChoice
IStepFunctionWait
的所有属性)。显然,任务将是
IStepFunctionWait
IStepFunctionChoice
IStepFunctionTask
,可以使用联合类型进行建模(
|

导出类型StepFunctionState=IStepFunctionTask
|功能选择
|等待;
const mixedBag:IDictionary={
任务
…选择,
等待
};

能否显示
IStepFunctionChoice
IStepFunctionWait
的定义?用实际代码替换该图片也会有所帮助。我现在将添加该图片,但我很确定这在该领域没有问题。能否也添加代码而不是初始化代码的图片,以便于复制粘贴和测试t:)我已经更新为使用代码而不是图像;我最初发布图像是为了说明没有错误,但我可以看到文本对人们更有用。让我再试一次……我在两者之间交替使用,
&
操作符是正确的,如果字典能够具有任务、选择和等待状态的混合,而当字典有任务、选择等时,您会使用
|
操作符。但不是混合。我很高兴能够得到纠正…这确实适用于
|
操作符。感谢您的提示。
const mixedBag: IDictionary<StepFunctionState> = {
  ...task,
  ...choice,
  ...wait
};
export type StepFunctionState = IStepFunctionTask 
    | IStepFunctionChoice 
    | IStepFunctionWait;

const mixedBag: IDictionary<StepFunctionState> = {
    ...task,
    ...choice,
    ...wait
};