23

我理解错误信息:

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

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

代码的背景是我有一个打字稿类,它被赋予了一个函数,然后将其存储为一个成员。我希望能够使用空的“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; 

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

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

4

2 回答 2

22

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

当您将其分配为this._noop = () => { };您尝试分配的功能时,它_noop是 type () => void

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

private _noop: () => void;
于 2017-07-28T08:30:41.413 回答
6

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

private _noop: () => {};

它等于:

private _noop: () => Object;

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

private _noop: () => any;

或者第一个语句将与这两个一起使用:

this._noop = () => ({});
this._noop = () => { return {} };
于 2017-07-28T08:28:46.460 回答