我正在尝试实现基于函数返回值而不是属性的类型缩小。
基于字段缩小范围的基本方法如下:
interface AFoo {
type: "A"
specificA();
}
interface BFoo {
type: "B"
}
var a: AFoo | BFoo = null as any;
if (a.type === 'A') {
a.specificA();
}
这就像一个魅力,基于联合类型和类型的值,TS 知道如何缩小条件内对象的类型。
我正在尝试做一些据说类似的事情,就像这样:
interface AFoo {
getType(): "A";
specificA();
}
interface BFoo {
getType(): "B";
}
var a: AFoo | BFoo = null as any;
if (a.getType() === 'A') {
a.specificA();
}
奇怪的是,TS 足够聪明,可以提供自动更正功能,并且知道
getType()
返回“A”或“B”,但类型缩小并未生效,并且 a
内部仍然是 AFoo | BFoo
类型条件语句。
我在这里遗漏了什么吗?
附带说明:我无法将 getType() 更改为字段,因为它实际上是传递到 JS 环境的 Java 类。
您可以使用另一个函数来验证您的逻辑:
function isA(value: AFoo | BFoo): value is AFoo {
if (value.getType() === 'A') {
return true;
}
return false;
}
if (isA(a)) {
a.specificA();
}