2012-10-12 54 views
7

我想創建一個輔助函數,以添加currying,爲類生成常見設置​​。例如:如何在TypeScript中匿名類

class Person { 
    private name: string; 
    private sex: string; 

    constructor (name: string, sex: string) { 
     this.name = name; 
     this.sex = sex; 
    } 
} 

var newPersonSex = function (sex: string) { 
    return function (name: string) { 
     return new Person(name, sex); 
    } 
} 

var MalePerson = newPersonSex('male'); 
var FemalePerson = newPersonSex('female'); 

所以,現在創建MalePerson和FemalePerson對象時,它實際上只是返回的人的一個新實例來代替。

var m = new MalePerson('john'); 

爲了使類型系統允許我仍然使用'新',MalePerson需要是一個構造類型。例如:'new(name:string)=> Person'。這也需要是函數的返回類型。

但是,添加這些聲明後,我無法從'newPersonSex'中返回函數。例如,這是無效的:

var newPersonSex = function (sex: string) : new(name:string) => Person { 
    return function (name: string) { 
     return new Person(name, sex); 
    } 
} 

如何創建和動態返回一個新的構造函數或類?

回答

2

嘗試newPersonSex的定義是:

var newPersonSex = function (sex: string) { 
    return <new (name: string) => Person> <any> function (name: string) { 
     return new Person(name, sex); 
    } 
} 

與您的代碼的問題是,其功能只是調用簽名,不簽名的建設。我上面的例子首先聲明該函數的類型是any,然後斷言任何類型實際上是一個構造函數。

請注意,newPersonSex的類型將從其返回類型推斷出來,因此不需要添加函數註釋。