【问题标题】:Type '() => void' is not assignable to type '() => {}'类型 '() => void' 不可分配给类型 '() => {}'
【发布时间】:2018-01-04 05:21:24
【问题描述】:

我明白错误信息:

类型 '() => 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; 

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

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

【问题讨论】:

    标签: typescript noop


    【解决方案1】:

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

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

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

    private _noop: () => void;
    

    【讨论】:

      【解决方案2】:

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

      private _noop: () => {};
      

      等于:

      private _noop: () => Object;
      

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

      private _noop: () => any;
      

      或者第一个语句将同时使用这两个:

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

      【讨论】:

      • 啊,太棒了……这更有意义。我没有意识到成员类型被错误地声明了。我以为我在宣布它是无效的。谢谢你解释。我的后续问题是如何声明一个返回 void 的函数类型。不过看起来@Saravana 已经做到了。
      猜你喜欢
      • 2021-09-23
      • 2017-09-21
      • 2019-05-12
      • 2017-12-29
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 2019-05-06
      • 2020-10-01
      相关资源
      最近更新 更多