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