Typescript 从if语句检测类型脚本类型
考虑以下几点:Typescript 从if语句检测类型脚本类型,typescript,type-inference,Typescript,Type Inference,考虑以下几点: interface A { type: 'A'; propA: 'a'; } interface B { type: 'B'; propB: 'b'; } interface C { propC: 'c'; } type OneOfAB = A | B; type OneOfABC = A | B | C; Typescript可以从if语句推断类型: const dataAB: OneOfAB = {} as any; if (dataAB.type
interface A {
type: 'A';
propA: 'a';
}
interface B {
type: 'B';
propB: 'b';
}
interface C {
propC: 'c';
}
type OneOfAB = A | B;
type OneOfABC = A | B | C;
Typescript可以从if语句推断类型:
const dataAB: OneOfAB = {} as any;
if (dataAB.type === 'A') {
console.log(dataAB.propA);
}
这可以很好地编译,但以下情况不能:
const dataABC: OneOfABC = {} as any;
if ('type' in dataABC && dataABC.type === 'A') {
console.log(dataABC.propA);
}
(属性“type”在类型“OneOfABC”上不存在。属性“type”在类型“C”上不存在。
)。
显然,Typescript并没有从dataABC中的“type”推断出dataABC的类型不是C
如何解决这个问题?我可以想出两种方法:
function isOneOfAB(data: OneOfABC): data is OneOfAB {
return 'type' in data;
}
const dataABC: OneOfABC = {} as any;
if (isOneOfAB(dataABC) && dataABC.type === 'A') {
console.log(dataABC.propA);
}
或:
在这两种情况下,我不得不说Typescript的作用远大于实际的帮助。在我的用例中,有三种以上的数据类型,它们有一些重叠的属性,但也不同。如果我像第一个示例中那样使用typeguard方法,这意味着我必须创建许多非平凡的typeguard函数来检查属性
我也倾向于放弃所有类型检查,使用any
类型。typescript是否有任何方法可以使用var
中的'property'之类的东西来推断类型?我会比您的示例更进一步,为类型a
提供一个自定义类型保护:
function isTypeA(data: any): data is A {
return 'type' in data && data.type ==='A';
}
const dataABC: OneOfABC = {} as any;
if (isTypeA(dataABC)) {
console.log(dataABC.propA);
}
通过这种方式,您可以一次性封装整个问题,而不是使用if语句,通过问两个问题来获得答案。我这样做了,效果非常好。每种类型有一个防护装置,也很容易在代码中组合。谢谢
function isTypeA(data: any): data is A {
return 'type' in data && data.type ==='A';
}
const dataABC: OneOfABC = {} as any;
if (isTypeA(dataABC)) {
console.log(dataABC.propA);
}