是否可以根据函数的返回值进行类型缩小?

问题描述 投票:0回答:1

我正在尝试实现基于函数返回值而不是属性的类型缩小。

基于字段缩小范围的基本方法如下:

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 类。

typescript type-narrowing
1个回答
0
投票

您可以使用另一个函数来验证您的逻辑:

function isA(value: AFoo | BFoo): value is AFoo {
  if (value.getType() === 'A') {
    return true;
  }
  return false;
}

if (isA(a)) {
  a.specificA();
}
© www.soinside.com 2019 - 2024. All rights reserved.