gpt4 book ai didi

typescript 将类型 `typeof Foo` 转换为 `Foo`

转载 作者:搜寻专家 更新时间:2023-10-30 20:42:04 25 4
gpt4 key购买 nike

我正在开发一个通用的 Typescript 接口(interface),其中一个工厂类是用一个特定的类实例化的,并且具有负责创建该类的各种实例的方法。我似乎无法实现的理想类型接口(interface)如下:

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`

但是如果我想让工厂类型接口(interface)正常工作,我必须维护一个镜像 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反之亦然?

最佳答案

假设X是构造函数值的名称和实例类型(声明 class X {...} 时发生的情况):


更新:

从 TypeScript 2.8 开始,有一个 predefined type function称为 InstanceType<>它采用类构造函数的类型并计算其实例的类型,使用 conditional type inference而不是查找。所以你现在可以从typeof X得到至 X通过使用 InstanceType<typeof X> .但是(typeof X)['prototype']下面仍然有效。


typeof X得到至 X , 你通常可以 lookup prototype typeof X 的属性(property)构造函数类型。例如,在下面我注释了 build() 的返回类型成为T['prototype'] :

class Factory<T extends typeof BaseModel> {
private _modelClass : T

constructor(modelClass : T) {
this._modelClass = modelClass
}

// note the declared return type
build(): T['prototype'] {
return new this._modelClass()
}

echoClassMethod() {
console.log(this._modelClass.classMethod())
}
}

然后是以下工作:

let factory = new Factory(Foo)
let fooInstance = factory.build() // Foo, as desired.

这有帮助吗?祝你好运!

关于 typescript 将类型 `typeof Foo` 转换为 `Foo`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48028287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com