2012-10-08 73 views
14

我想知道如何獲得對函數作爲值傳遞的類型構造函數的引用。 基本上,我想有一個通用類型註冊表,它允許通過調用泛型類型註冊表實例的成員函數來創建實例。引用構造函數

例如:

class GeometryTypeInfo 
{   
    constructor (public typeId: number, public typeName: string, public fnCtor: (...args: any[]) => IGeometry) { 
    } 
    createInstance(...args: any[]) : IGeometry { return this.fnCtor(args); } 
    } 
} 

後來:

class Point implements IGeometry { 
    constructor(public x: number, public y: number) { } 

    public static type_info = new GeometryTypeInfo(1, 'POINT', Point); // <- fails 
    // also fails: 
    // new GeometryTypeInfo(1, 'POINT', new Point); 
    // new GeometryTypeInfo(1, 'POINT', Point.prototype); 
    // new GeometryTypeInfo(1, 'POINT', Point.bind(this)); 
} 

任何人都知道,如果有可能引用的類構造函數?

回答

18

您可以使用構造函數類型literal或具有構造簽名的對象類型literal來描述構造函數的類型(通常參見語言規範的第3.5節)。要使用你的榜樣,下面應該工作:

interface IGeometry { 
    x: number; 
    y: number; 
} 

class GeometryTypeInfo 
{   
    constructor (public typeId: number, public typeName: string, public fnCtor: new (...args: any[]) => IGeometry) { 
    } 
    createInstance(...args: any[]) : IGeometry { return new this.fnCtor(args); } 
} 

class Point implements IGeometry { 
    constructor(public x: number, public y: number) { } 

    public static type_info = new GeometryTypeInfo(1, 'POINT', Point); 
} 

注意構造型GenometryTypeInfo的構造函數參數列表中的文字,並在createInstance建立實施新的呼叫。

+0

謝謝,我錯過了規範中的'新'字面值。 –

+1

in'// < - fails'我想它是解決方案,它不會失敗,如果這是正確的,也許你可以編輯它爲'// < - 不再失敗'或類似的東西?否則它有點誤導,thx – peter

6

typeof YourClass給你構造函數類型它可以在類型註釋中使用。

YourClassthis.constructor本身就是構造函數。所以,這個代碼編譯:

class A {} 

const B : typeof A = A; 

this.constructor不受打字稿(這是有趣的)的情況下,認定爲構造類型的值,所以像你需要使用一些作弊鑄造它沒有any

new (<any> this.constructor)()

就是這樣。

+0

這個解決方案的問題是OP想要引用類型「實現接口的類型的構造函數」,並且我相信當'IGeometry'是一個接口時你不能說'typeof IGeometry' 。在傳遞參數是給定類或超類的構造函數的情況下,這是一個很好的方法。 – jkjustjoshing

+1

'接口MyCtor {new():MyInterface}'應該完成這項工作。 – gaperton

+2

但是我更喜歡'typeof Class'。它更具體,並正確處理繼承鏈。 – gaperton

相關問題