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

Posted

技术标签:

【中文标题】类型 \'() => void\' 不可分配给类型 \'() => \'【英文标题】: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; 

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

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

【问题讨论】:

【参考方案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 已经做到了。

以上是关于类型 '() => void' 不可分配给类型 '() => '的主要内容,如果未能解决你的问题,请参考以下文章

使用反应成帧器类型'()=> void'的打字稿错误不可分配给类型'未定义'

React 错误:类型“void”不可分配给 React.Component 中的类型“Readonly<>”

如何修复类型 'AsymmetricMatcher<any>' 不可分配给类型 '() => void'。在茉莉花/开玩笑

void' 不可分配给类型为 '(value: User[], index: number) => boolean' 的参数

错误:类型“void”不可分配给类型“ReactNode”

类型'void'不可分配给类型'FormData'。