“() => void”类型无法分配给“() => {}”类型。

35

我理解了错误信息:

类型“() => void”不能赋值给类型“() => {}”

嗯,有点明白了,它告诉我存在类型转换问题。但是我无法弄清楚为什么编译器认为这些类型不同。

代码的背景是,我有一个 TypeScript 类,该类接收一个函数并将其存储为成员。我想能够使用空的“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; 

另外两个语句会产生编译错误。

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

2个回答

26

在你的定义中,private _noop: () => {};_noop的类型定义为返回对象的函数。

当你将它赋值为this._noop = () => { };时,你试图赋给_noop的函数的类型是() => void

如果你想让_noop成为一个不返回任何内容的函数,则将其类型定义为:

private _noop: () => void;

8
以下定义的意思是,_noop 是一个函数,必须返回一个对象(包括 undefined 和 null)。
private _noop: () => {};

它等同于:

private _noop: () => Object;

您可以使用以下方式使这三个语句都起作用:

private _noop: () => any;

对于这两种情况,第一条语句都可以正常工作:

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

啊,太棒了...这样更有意义。我没有意识到成员类型声明错误。我以为我在声明它为空。谢谢你解释了这个问题。我的后续问题将是如何声明一个返回void的函数类型。然而,看起来@Saravana已经做到了。 - Tom Maher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接