类型'()=>无效'不能分配给类型'()=> {}'

Tom*_*her 8 no-op 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...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

this._noop = () => undefined; 
Run Code Online (Sandbox Code Playgroud)

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

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

Sar*_*ana 7

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

当您将其分配为this._noop = () => { };要分配给的_noop功能时,其类型为() => void

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

private _noop: () => void;
Run Code Online (Sandbox Code Playgroud)


Val*_*Val 6

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

private _noop: () => {};
Run Code Online (Sandbox Code Playgroud)

它等于:

private _noop: () => Object;
Run Code Online (Sandbox Code Playgroud)

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

private _noop: () => any;
Run Code Online (Sandbox Code Playgroud)

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

this._noop = () => ({});
this._noop = () => { return {} };
Run Code Online (Sandbox Code Playgroud)