首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么类型记录不能在使用区分类型检查时推断返回类型

为什么类型记录不能在使用区分类型检查时推断返回类型
EN

Stack Overflow用户
提问于 2020-08-28 16:16:50
回答 5查看 339关注 0票数 2

我想了解为什么TypeScript不能推断以下函数的返回类型(虽然它能够在if-else语句中进行区分):

代码语言:javascript
复制
function calc (arg: number|string) {
  if (typeof arg === 'number') {
    // here typescript knows arg is number type
    return arg 
  } else if (typeof arg === 'string') {
    // here typescript knows arg is string type
    return arg 
  }
}

// infers test to be  number|string|undefined
const test = calc(10)

当我们编写以下函数时:

代码语言:javascript
复制
function calc (arg: number|string) {
  return String(arg)
}

// infers test to be string
const test = calc(10)

然后,它当然可以推断返回类型。但是,它为什么不能推断出第一个函数的返回类型,同时在不同的分支中提供类型安全性,并且知道它得到一个名为arg的数字类型?

编辑

我知道如何解决这个问题,但我真的想知道为什么TypeScript不能这么做?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2020-08-28 17:50:45

类型记录不会自动完成这一任务,因为这需要评估您的函数,即实际运行代码。尽管参数是在编译时已知的,而且理论上可能是可能的,但它不会尝试这样的方法。也许在这种情况下,这看起来应该很简单,但在一般情况下并非如此。

当它缩小块中的类型时,它只表示(如果条件为true,则类型为X ),但它实际上并不是用值计算条件。

票数 3
EN

Stack Overflow用户

发布于 2020-08-28 16:19:58

代码语言:javascript
复制
function calc (arg: number): number;
function calc (arg: string): string;
function calc (arg: number|string) {
  if (typeof arg === 'number') {
    // here typescript knows arg is number type
    return route
  } else if (typeof arg === 'string') {
    // here typescript knows arg is string type
    return route
  }
}

可以通过重载原始函数定义来指定特定参数类型的返回值。

另见:https://www.typescriptlang.org/docs/handbook/functions.html#overloads

票数 4
EN

Stack Overflow用户

发布于 2020-08-28 16:22:52

如果返回类型应该与输入相同,则还可以使用泛型。

代码语言:javascript
复制
function calc <T extends number|string>(arg: T): T {
  if (typeof arg === 'number') {
    // here typescript knows arg is number type
    return arg
  } else if (typeof arg === 'string') {
    // here typescript knows arg is string type
    return arg
  }
  throw new Error('should not reach here')
}

const t = calc(12)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63637515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档