为什么() => 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
我想知道这是否是错误吗?
答案 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
的子类型。
虽然命名函数没有相同的行为,这似乎很奇怪。