类型“() => void”不可分配给类型“() => {}”

Type '() => void' is not assignable to type '() => {}'

我理解错误信息:

Type '() => void' is not assignable to type '() => {}'

好吧,它告诉我存在类型转换问题。但是我不明白为什么编译器认为类型不一样。

代码的背景是我有一个打字稿class,它被赋予了一个函数,然后将其存储为一个成员。我希望能够用一个空的 'noop' 函数初始化成员,这样它就不必在使用前进行空检查。

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

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...
    }
}

构造函数中的三个语句都是为了做同一个工作:初始化一个无操作函数的成员。但是只有最后一条语句有效:

this._noop = () => undefined; 

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

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

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

private _noop: () => {};

等于:

private _noop: () => Object;

您可以使所有三个语句都适用于:

private _noop: () => any;

或者第一个语句适用于这两个:

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

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

当您将其分配为 this._noop = () => { }; 时,您尝试分配给 _noop 的函数的类型为 () => void

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

private _noop: () => void;