1. ホーム
  2. typescript

[解決済み] クラスをパラメータとして渡すと "is not newable "エラーが発生する。

2023-06-29 02:53:29

質問

あるクラスのインスタンスを作成し、それを返す関数に、パラメータとしてクラスを渡そうとしています。以下は私のコードです。

module A.Views {
  export class View { ... }
}

module A.App {
  export class MyApp {
    ...
    registerView(viewKlass:A.Views.View):void
    {
        var test = new viewKlass;
    } 
  }
}

これをコンパイルしようとすると、次のようになります。

(...): Value of type 'Views.View' is not newable.

私は何を間違えているのでしょうか?

newable型の値がオブジェクトのコンストラクタである場合、実行時にコンストラクタ関数をどのように渡せばよいのでしょうか?

どのように解決するのですか?

関数のシグネチャでオブジェクトとクラスを区別するためにtypeof(MyClass)というものが必要です。

とにかく、コンストラクタのタイプシグネチャを使えば、この問題は解決します。 このクラスで考えてみましょう。

class MyClass {
    constructor (private name: string) {
    }
}

そのクラスを関数内でインスタンス化できる型として渡すには、実際にはこのようにクラスのコンストラクタのシグネチャを複製する必要があります。

function sample(MyClass: new (name: string) => MyClass) {
    var obj = new MyClass("hello");
}

EDIT : codeplexに簡単な解決策があります。

このようにクラスのインターフェイスを作成する必要があります。

interface IMyClass {
    new (name: string): MyClass;
}

そして、これを関数のシグネチャで使用します。

function sample(MyClass: IMyClass) {
    var obj = new MyClass("hello");
}