【发布时间】:2017-12-29 20:49:08
【问题描述】:
我正在开发一个通用 Typescript 接口,其中工厂类使用特定类进行实例化,并且具有负责创建该类的各种实例的方法。我似乎无法实现的理想类型接口如下:
class BaseModel { /* impl */ }
class Foo extends BaseModel { /* impl */ }
class Factory<T extends BaseModel> { /* impl */ }
let factory : Factory<Foo> = new Factory(Foo)
let fooInstance = factory.build() // returns type: `Foo`
但是我不知道如何在不影响返回类型或维护并行构造函数类型定义的情况下获得Factory<T> 的声明以实现此目的。
如果我只依赖我声明的类给出的类型,构建函数的返回类型总是BaseClass,另外我必须使用通用Factory<typeof Foo>而不是Factory<Foo>:
class BaseModel {
static classMethod() : string {
return 'i am class method'
}
hello() {
return 'hello world'
}
}
class Foo extends BaseModel {}
class Factory<T extends typeof BaseModel> {
private _modelClass : T
constructor(modelClass : T) {
this._modelClass = modelClass
}
build() {
return new this._modelClass()
}
echoClassMethod() {
console.log(this._modelClass.classMethod())
}
}
let factory : Factory<typeof Foo> = new Factory(Foo)
let fooInstance = factory.build() // Returns type `BaseClass` instead of `Foo`
但如果我希望工厂类型接口正常工作,我必须维护一个镜像typeof BaseModel 的并行类型定义,而是作为构造函数:
class BaseModel {
static classMethod() : string {
return 'i am class method'
}
hello() {
return 'hello world'
}
}
class Foo extends BaseModel {}
// Have to maintain a separate type that
// mirrors the class interface of my target class
type BaseModelConstructor<T extends BaseModel> = {
new(...args: any[]) : T
classMethod() : string
}
class Factory<T extends BaseModel> {
private _modelClass : BaseModelConstructor<T>
constructor(modelClass : BaseModelConstructor<T>) {
this._modelClass = modelClass
}
build() {
return new this._modelClass()
}
echoClassMethod() {
console.log(this._modelClass.classMethod())
}
}
let factory : Factory<Foo> = new Factory(Foo)
let fooInstance = factory.build() // Correctly returns type `Foo`
必须有更好的方法将typeof X 转换为X,反之亦然?
【问题讨论】:
标签: typescript generics