82

このクラスをインスタンス化して返す関数に、クラスをパラメータとして渡そうとしています。これが私のコードです:

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 型の値がオブジェクト コンストラクターの場合、実行時にコンストラクター関数を渡すにはどうすればよいですか?

4

8 に答える 8

109

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

とにかく、コンストラクタ型シグネチャを使用して実際に問題を解決できます。このクラスを考慮すると:

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

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

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

編集: codeplex で見つかった簡単な解決策があります:

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

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

次に、関数シグネチャで使用します。

function sample(MyClass: IMyClass) {
    var obj = new MyClass("hello");
}
于 2012-10-13T08:45:30.373 に答える
31

これを試して:

export class MyApp {
    registerView(viewKlass: typeof A.Views.View): void {
        var test = new viewKlass();
    } 
}
于 2016-06-28T16:18:59.487 に答える
3

状況によっては、次の 3 つのソリューションでは不十分な場合があります。

  1. myClass: new (name: string) => MyClass
  2. interface IMyClass { new (name: string): MyClass; }; myClass: IMyClass
  3. myClass: typeof MyClass

のような静的メソッドを呼び出したい場合がありますmyClass.someMethod()1彼らはその方法について知らないので、あなたがそれを行うことを許可し2ません(そして、plsはあなたのアプリで決して使用しません)。

あるいは、抽象MyClassクラスとして持ち、 myClass のインスタンスを で作成したい場合もあります。その場合、失敗します。let instance = new myClass3

これらの場合に私が行うことはMyClass、上で強調した問題を解決するための特別なタイプを作成することです。これは次のようになります。

type MyClassContructor<T extends MyClass> = typeof MyClass & Constructor<T>;

ところで。適切なインテリセンスを得るために、戻り値の型をメソッドに追加することを忘れないでください。

于 2019-10-04T15:36:12.577 に答える
-1

要点をありがとう-わずかな変更はそれがすべてうまくいくようにします。TestView以下の例では、メソッド内で新しいテストビューを作成するのではなく、具体的なテストビューで合格するために「新規作成」します。

module V.Views {
   export class View {
      public someVar: any;
      // the presence of constructor doesn't affect the error triggering
   }
}

module V.App {
    export class Application {
        public registerView(url: string, viewKlass: V.Views.View): void
        {
            var test = viewKlass;
        }
    }
}

var app = new V.App.Application;

class TestView extends V.Views.View {
}

class TestView2 extends V.Views.View {
}

app.registerView('', new TestView())
app.registerView('content/view/:slug/', new TestView2())
于 2012-10-09T15:09:25.670 に答える