違い - typescript 入門




TypeScriptデコレータは "式として呼び出されたときにクラスデコレータの署名を解決できません" (2)

これは、ES2016またはES5をtsconfig.jsonのターゲットとして追加することで解決されるようです

https://github.com/alsatian-test/alsatian/issues/344#issuecomment-290418311

@xxx("xxx")
class A{
    msg:string
    constructor(msg:string) {
        this.msg = msg
    }
    print() {
        console.log(this.msg)
    }
}

function xxx(arg:string) {
    function f(target) {
        function ff(msg: string) {
            return new target(arg + ":" + msg)
        }
        return ff
    }
    return f
}

let a = new A("hellow")
a.print()

コンパイルすると、次のように報告されます。

decorator.ts(1,1):エラーTS1238:式として呼び出されたときにクラスデコレータの署名を解決できません。 タイプ '(msg:string)=>任意の'はタイプ 'void'に割り当てられません。

しかし、ジェネレーションされたjsはうまくいった。 私はなぜ報告の誤りか分からない。


コンパイラは、あなたのデコレータが無効であるか、またはAと互換性のある値を返すことを期待しています。これは、 (msg:any) => anyを返しますが、Aと互換性があるという結論を引き出すことはできません。

エラーを取り除きたい場合は、ffを返すときにffをキャストするか、またはtypeof Aを明確に伝えるためにtypeof Aにキャストすることもできます。

function xxx(arg: string)
{
    function f(target)
    {
        function ff(msg: string)
        {
            return new target(arg + ":" + msg)
        }
        return <typeof A><any>ff
    }
    return f
}

それはおそらく、このようなクラスを置き換えることは良い考えではない、少なくともコンストラクタを維持する必要があります:

TypeScriptドキュメント:

注意新しいコンストラクタ関数を返すことを選択した場合は、元のプロトタイプを維持するように注意する必要があります。 実行時にデコレータを適用するロジックは、これを行うことはありません。





typescript