我无法将参数化函数分配给作为无参数函数输入的变量:
var ak: () => void = (eventData: Human) => { };
我收到编译时错误:
错误TS2322类型'(eventData:Human)=> void'不能分配给'()=>类型无效”。
但是我可以做相反的事情:
var ak: (data: Human) => void = () => { };
这是为什么?
注意我在VS 2013中使用TS 1.4。
答案 0 :(得分:3)
var ak: (data: Human) => void = () => { };
如果调用一个期望带有0个参数的1个参数的函数会发生什么?该功能几乎肯定会失败。
var ak: (data: Human) => void = () => { };
如果调用期望带有1个参数的0个参数的函数会发生什么?该函数将忽略该参数,并且生活正常进行。
为什么忽略参数可以?考虑这个功能(摘自现实):
function forEach<T>(arr: T[], callback: (elem: T, index: number)) {
for(var i = 0; i < arr.length; i++) {
callback(arr[i], i);
}
}
让我们使用此函数打印数组中的所有元素:
function print(i: number) {
console.log(i.toString());
}
forEach([1, 2, 3, 4], print);
我们刚刚将一个参数传递给只需要一个的函数!如果编译器迫使我们不得不做这样的事情,那将是非常令人讨厌:
// Manually throw away the second parameter, ugh
forEach([1, 2, 3, 4], (x, y) => print(x));
答案 1 :(得分:1)
Ryan Cavanaugh的回答让我们深入了解为什么它会像那样起作用。 我想补充一点,如果你真的不关心通过的论点,你可以选择它:
var ak: () => void = (eventData?: Human) => { };
请注意参数名称后面的问号。
此功能可分配给() => void
,但您应准备好eventData
undefined
。