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);
}