首页 > 解决方案 > TypeScript:转换类型'a | b' 到 'a' 基于 typeof

问题描述

我是 TypeScript 的新手,并试图了解如何使用强制转换。我正在使用一个定义类似于以下函数的 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'.

我觉得这是应该在编译时确定的。显然,我们只进入 else if typeof bar === number,但在这个代码片段中尝试:

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 中进行强制转换的可能性非常迷茫。有没有办法实现我的目标?任何帮助将不胜感激。

标签: typescriptcastingcompiler-errors

解决方案


if (typeof bar === undefined) {

typeof 运算符产生一个字符串,所以你真正应该测试的是:

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

正如你所知道的,这种if情况永远不会成立,所以代码总是进入else块中。因此,Typescript 推断出返回语句可以在bar未定义的情况下到达,这与您说要返回的类型冲突。


推荐阅读