我正在尝试实现这个:
// type A guard alternative
private isTypeA_alt(object: AnyDTO): object is A_DTO {
return (
object.type === this.Types.Type_A && object.uniquePropertyA !== undefined
);
}
// type A,B,C, etc. guard handler...
private castObjectToType(object: unknown): AnyDTO | undefined {
if (object === undefined || !this.hasProperty(object, 'type')) {
return undefined;
}
switch (object.type) {
case this.Types.Type_A:
return object as A_DTO;
case this.Types.Type_B:
return object as B_DTO;
default:
return undefined;
}
}
但我不确定为什么铸造不起作用......(参见下面的 stackblitz)
堆栈闪电战: https://stackblitz.com/edit/stackblitz-starters-6eped6?file=src%2Fcmp%2Fcmp.component.ts
我是否必须为每个可用类型创建一个类型保护函数?
我简化了您的代码并使其可以使用
<T>
工作,每当我们调用该方法时我们都可以定义类型,它将定义该变量的类型!
类型功能
private castObjectToType<T>(object: AnyDTO): T | undefined {
if (object === undefined || !this.hasProperty(object, 'type') || !object.type) {
return undefined;
}
return object as T;
}
键入函数调用
// type function handler - CANNOT GET TO WORK : (
let variable = this.castObjectToType<B_DTO>(this.object);
variable?.uniquePropertyB; //--> adding question mark, since it can be undefined, so we do a safe check!