我想了解为什么TypeScript不能推断以下函数的返回类型(虽然它能够在if-else语句中进行区分):
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)当我们编写以下函数时:
function calc (arg: number|string) {
return String(arg)
}
// infers test to be string
const test = calc(10)然后,它当然可以推断返回类型。但是,它为什么不能推断出第一个函数的返回类型,同时在不同的分支中提供类型安全性,并且知道它得到一个名为arg的数字类型?
编辑
我知道如何解决这个问题,但我真的想知道为什么TypeScript不能这么做?
发布于 2020-08-28 17:50:45
类型记录不会自动完成这一任务,因为这需要评估您的函数,即实际运行代码。尽管参数是在编译时已知的,而且理论上可能是可能的,但它不会尝试这样的方法。也许在这种情况下,这看起来应该很简单,但在一般情况下并非如此。
当它缩小块中的类型时,它只表示(如果条件为true,则类型为X ),但它实际上并不是用值计算条件。
发布于 2020-08-28 16:19:58
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
发布于 2020-08-28 16:22:52
如果返回类型应该与输入相同,则还可以使用泛型。
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)https://stackoverflow.com/questions/63637515
复制相似问题