在TypeScript中为什么不能将参数化函数分配给无参数函数类型?

时间:2015-05-20 20:03:37

标签: typescript

我无法将参数化函数分配给作为无参数函数输入的变量:

var ak: () => void = (eventData: Human) => { };

我收到编译时错误:

错误TS2322类型'(eventData:Human)=> void'不能分配给'()=>类型无效”。

但是我可以做相反的事情:

var ak: (data: Human) => void = () => { };

这是为什么?

注意我在VS 2013中使用TS 1.4。

2 个答案:

答案 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

相关问题