2016-06-18 21 views
1

鑑於我怎樣才能聲明一個參數是類型而不是Typescipt類型的實例?

Class X{ 
} 

我想通過類作爲參數,如:

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

是構建簽名(接口),我唯一的選擇嗎?

我大概可以使用構造簽名,但感覺不自然,構造簽名似乎並不能傳達可以新增的特定類型。我可能會錯過我想的一些細節。下面是一個更詳細的例子,但是泛型不是運行時類型。

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,你爲什麼要說newType? – Mick

回答

0

使用typeof型運營商以獲取特定值的類型(在你的情況,X):

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

我希望傳入類型。這裏X是靜態的。我會更詳細地更新我的問題。 –

+0

所以 讓X =函數SomeType(){ \t }; class MyClass someMethod(myCtor:typeof X){ let f:X = new myCtor(); //好吧 } } 不起作用。 –

1

您需要通過構造函數爲一個參數,因爲中的<T>只是幫助打字稿推斷類型信息,這些信息將在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

相關問題