2016-06-18 3 views
1

Typesciptでパラメータが型であり型ではないことを宣言するにはどうすればよいですか?私のようなパラメータとしてクラスを渡したい</p> <pre><code>Class X{ } </code></pre> <p>を考える

someMethod(theType: ?X?){ 
    theType.staticMethod //or 
    new theType(); 
} 

は、ここに署名(インタフェースに)私の唯一のオプションを構築していますか?

私はおそらく構文シグネチャを使用することができますが、それは不自然な感じがあり、構文シグネチャは実際にnewすることができる特定のタイプを伝えていないようです。私が考えている細部を見逃しているかもしれません。より詳細な例がありますが、実行時の型ではないジェネリックがあります。

abstract class GreeterBase<T extends GreeterBase<T>>{ 
    message:string; 

    constructor(message:string){ 
     this.message=message; 
    } 

    public static create<T>(message:string):T{ 
     //This is the only part that doesn't work. 
     return new T(message); //This doesn't work. 
    } 

    public abstract greet():string; 

    public logMessage(){ 
     console.log(this.message); 
    } 

} 

class EnglishGreeter extends GreeterBase<EnglishGreeter>{ 
    constructor(message: string) { 
     super(message); 
    } 

    greet() { 
     return "Hello, " + this.message; 
    } 
} 

class FriendlyMessager<T extends GreeterBase<T>>{ 

    private _myGreeter:T; 

    constructor(andSoForth:string){ 
     this._myGreeter = GreeterBase.create<T>(andSoForth); 
     this._myGreeter.logMessage(); 
    } 

    public sendGreeting(){ 
     this._myGreeter.greet(); 
    } 
} 

let messager = new FriendlyMessager<EnglishGreeter>(', how are you'); 
messager.sendGreeting(); 

TS遊び場Link

+0

あなたの目標は何かわからない。あなたの質問を指定してもよろしいですか?あなたが新しいXを持っているなら、あなたはなぜ新しいtheTypeを言うのですか? – Mick

答えて

0

(あなたのケースでは、X)特定の値の型を取得するためにtypeofタイプの演算子を使用します。

someMethod(myCtor: typeof X) { 
    let f: X = new myCtor(); // OK 
} 
+0

私はtheTypeが渡されることを望みます。ここでXは静的です。質問をより詳細に更新します。 –

+0

だから X = function SomeType(){ \t }とする。 class MyClass { someMethod(myCtor:typeof X){ f:X = new myCtor(); // OK } } 動作しません。 –

1

あなたのようにコンストラクタ関数を渡す必要がありますパラメータ<T>public static create<T>(message:string)は、typescriptがタイプ情報を推測するのに役立ちます。これはjsで失われます。

public static create<T>(message:string, cTor: {new(string): T;}):T{ 
    //This is the only part that doesn't work. 
    return new cTor(message); //This doesn't work. 
} 

私はクラスを再設計するべきだと思います。たぶんlike this

関連する問題

 関連する問題