TypeScript:转换类型'a |基于typeof的b'至'a'

时间:2019-10-22 04:03:46

标签: typescript casting compiler-errors

我是TypeScript的新手,试图了解如何使用强制转换。我正在使用API​​,该API定义了类似于以下内容的功能:

function foo(a: number): number | undefined;

我想对该数字的返回值执行函数以始终安全地将其转换为数字,但是出现错误:

function myFunc(bar: number | undefined): number {
  if (typeof bar === undefined) {
    return 0;
  } else {
    return bar; // error ts(2322)
  }
}

ts(2322)扩展到Type 'number | undefined' is not assignable to type 'number'. Type 'undefined' is not assignable to type 'number'.的地方

我觉得这是应该在编译时确定的。显然,我们仅在typeof bar === number的情况下进入else,但在以下代码段中尝试进行此操作:

function myFunc(bar: number | undefined): number {
  if (typeof bar === number) { // error ts(2367)
    return bar;
  } else {
    return 0;
  }
}

错误消息为This condition will always return 'false' since the types '"string" | "number" | "bigint" | "boolean" | "symbol" | "undefined" | "object" | "function"' and 'Requireable<number>' have no overlap.

在这一点上,我对TypeScript中的强制转换还很迷茫。有没有办法实现我的目标?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

if (typeof bar === undefined) {

typeof operator产生一个字符串,因此您真正应该测试的是:

if (typeof bar === "undefined") {

如您所知,if的情况永远不会成立,因此代码始终进入else块。因此,Typescript推断出bar仍未定义时可以到达return语句,这与您说要返回的类型冲突。

答案 1 :(得分:0)

尼古拉斯(Nicholas)提供了详细的解释,但您当然可以简单地实现以下功能:

function myFunc(bar: number | undefined): number {
    return bar || 0;
}