web-dev-qa-db-ja.com

タイプ '()=> void'はタイプ '()=> {}'に割り当てることができません

エラーメッセージを理解しました。

タイプ '()=> void'はタイプ '()=> {}'に割り当てることができません

まあ、それはタイプキャストの問題があることを私に伝えています。しかし、コンパイラが型が同じではないと考える理由を理解することはできません。

コードの背景は、関数が指定された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...
    }
}

コンストラクターの3つのステートメントは、すべて同じ作業を行うことを目的としています。操作関数を使用せずにメンバーを初期化します。ただし、最後のステートメントのみが機能します。

this._noop = () => undefined; 

他の2つのステートメントはコンパイルエラーを生成します。

コンパイラが型を一致できないように見える理由を誰かが知っていますか?

8
Tom Maher

定義では、private _noop: () => {}; __noop_は、オブジェクトを返す関数として型指定されています。

this._noop = () => { };として割り当てる場合、__noop_に割り当てようとしている関数は_() => void_型です。

__noop_を何も返さない関数にしたい場合は、次のように入力します。

_private _noop: () => void;
_
8
Saravana

以下の定義は、_noopがオブジェクト(未定義およびnullを含む)を返す必要がある関数であることを意味します。

private _noop: () => {};

次と等しい:

private _noop: () => Object;

3つのステートメントすべてを次のように機能させることができます。

private _noop: () => any;

または、最初のステートメントは次の両方で機能します。

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