返回类型为void的箭头函数是否未经类型检查?

时间:2018-09-10 21:44:17

标签: typescript

为什么() => void变量不强制执行其分配函数的返回类型?

// Error as expected
let x: void = 1

// No error?
let y: () => void = () => 1

// Error as expected
function z(): void { return 1 }

箭头功能的行为与上面的其他示例不同似乎很奇怪。

() => undefined类型完成了我期望() => void做的事情。

// Error as expected
let foo: () => undefined = () => 1

我想知道这是否是错误吗?

2 个答案:

答案 0 :(得分:2)

两者的语义有些不同。

let y: () => void = () => 1

在这里,您定义了一个变量y,其类型注释为()=> void,并为其分配了功能。基于箭头函数(() => number)的定义,分配的函数的类型为()=> 1。两种函数类型兼容,因为使用y时应忽略结果(因为它是void),而实现的返回值将被忽略。关键是打字稿将箭头功能和y的类型视为两个不同的事物,分别进行独立键入,然后检查兼容性。虽然这里的类型注释和函数定义彼此相邻,但它们可以是分开的:

let x = () => 1   
let y: () => void = x

还请注意,这不仅与箭头函数有关,正则函数表达式将具有相同的行为:

let y: () => void = function() { return 1 } //ok

在第二种情况下,您要说明当前声明的函数的返回类型应为void。从这样的函数声明返回任何内容都可能是一个错误,并被标记为这样。

答案 1 :(得分:1)

我发现this comment可以解释其基本原理。

这个想法是void意味着返回类型将被忽略。因此,任何返回值都是可以接受的。实际上,void类型是any的子类型。

虽然命名函数没有相同的行为,这似乎很奇怪。