输入'()=> void'不能分配给'()=>类型{}”

时间:2017-07-28 08:21:08

标签: typescript noop

我理解错误消息:

  

输入'()=> void'不能分配给'()=>类型{}“

好吧,它告诉我有一个类型转换问题。但是我无法理解为什么编译器认为类型不一样。

代码的背景是我有一个给出函数的typescript类,然后将它存储为成员。我希望能够使用空的'noop'函数初始化该成员,以便在使用之前不必对其进行null检查。

我已设法将问题减少到以下示例测试代码:

export class Test {
    private _noop: () => {};

    constructor(
    ) {
        this._noop = () => { };     //I guess the compiler thinks this is returning in a new empty object using the json syntax
        this._noop = this.noop;     //I would have thought this shoud definitely work
        this._noop = () => undefined;   //This does works
    }

    public noop(): void {
        //Nothing to see here...
    }
}

构造函数中的三个语句都是为了完成相同的工作:使用no操作函数初始化成员。但是只有最后一个声明有效:

this._noop = () => undefined; 

其他两个语句产生编译错误。

有没有人知道为什么编译器似乎无法匹配类型?

2 个答案:

答案 0 :(得分:4)

在您的定义中private _noop: () => {}; _noop被输入为返回对象的函数。

当您将其指定为this._noop = () => { };时,您尝试分配给_noop的功能属于() => void类型。

如果您希望_noop函数返回任何内容,请将其键入:

private _noop: () => void;

答案 1 :(得分:2)

下面的定义意味着,_noop是一个函数必须返回一个对象(包括undefined和null)。

private _noop: () => {};

它等于:

private _noop: () => Object;

你可以使所有三个陈述都适用于:

private _noop: () => any;

或第一个语句适用于以下两个:

this._noop = () => ({});
this._noop = () => { return {} };