我想为AWS Lambda的回调函数创建一个Typescript,并且必须做一些愚蠢的事情,因为我在看似容易的事情上得到了错误。我接近它的方法是为SUCCESS和FAILURE条件设置两个函数定义,然后将它们作为区分联合包装在一起。
所以这是我的类型:
export interface ILambdaSuccessCallback<T = IDictionary> {
(error: null, response: T): void;
}
export interface ILambdaFailureCallback<E = ILambdaErrorResponse> {
(error: string | number, response: E): void;
}
export interface ILambdaErrorResponse<T = any> {
errorCode?: string | number;
message?: string;
errors?: T[];
stackTrace?: string[];
}
/** Discriminated Union */
export type LambdaCallback<T = IDictionary, E = ILambdaErrorResponse> =
| LambdaSuccessCallback<T>
| LambdaFailureCallback<E>;
我现在在vs-code中加入了我的小视觉测试,显示失败和成功的行为或明确使用,但更重要的是,受歧视工会只是没有工作:
答案 0 :(得分:1)
联合类型(使用|
定义)表示可以是ILambdaSuccessCallback
或ILambdaFailureCallback
的类型,这意味着这两个签名都不可调用,因为编译器无法检查哪个是有效的。使用联合类型,您只能访问公共字段和签名,而ILambdaSuccessCallback
和ILambdaFailureCallback
没有共同的属性或签名,
如果您的函数可以处理两个签名,则需要交集类型(使用&
定义)
export type LambdaCallback<T = IDictionary, E = ILambdaErrorResponse> =
& ILambdaSuccessCallback<T>
& ILambdaFailureCallback<E>;
const either: LambdaCallback = function (err: null | string | number, con: IDictionary | ILambdaErrorResponse) {
}
either(null, {}) // Works
either(500, {}) // Works
第二次failure
调用(failure(null, {})
)有效,因为在Typescript中,null
和undefined
是所有类型的子类型(请参阅spec)和因此,您可以将null
分配给string | number
,您可以启用strictNullChecks
以使编译器禁止此方案(但这可能会导致许多其他警告)