Typescript 如何使用泛型访问typeof类
在这里,我希望得到Typescript 如何使用泛型访问typeof类,typescript,Typescript,在这里,我希望得到Alpha和Beta,但出于某种原因,InstanceType没有激活类中泛型的“默认”/“指定”值 是否可以传入一个泛型并拥有一个共享方法,如上面的.create(),其中两个类都返回各自的实例,但使用默认泛型 我也试过T['prototype'],但没有得到任何运气 我希望有一种方法可以创建一个自定义的实例类型,但我认为这是不可能的。这是TypeScript附带的一个。我认为它无法访问泛型 class Alpha<T = string> { static c
Alpha
和Beta
,但出于某种原因,InstanceType
没有激活类中泛型的“默认”/“指定”值
是否可以传入一个泛型并拥有一个共享方法,如上面的.create()
,其中两个类都返回各自的实例,但使用默认泛型
我也试过T['prototype']
,但没有得到任何运气
我希望有一种方法可以创建一个自定义的实例类型
,但我认为这是不可能的。这是TypeScript附带的一个。我认为它无法访问泛型
class Alpha<T = string> {
static create<T extends typeof Alpha>(this: T): InstanceType<T> {
const v = new Alpha();
return v as InstanceType<T>;
}
}
class Beta<T = number> extends Alpha<T> {}
const a = Alpha.create(); // returns Alpha<unknown>
const b = Beta.create(); // returns Beta<unknown>
type InstanceType any>=T扩展新(…args:any)=>推断R?R:有吗
T
适用于类的一个实例,并且每个实例可能不同。您的方法create
是static
,因此不绑定到类的任何实例,因此它不会从类继承任何泛型t
只是一个默认值。它实际上并没有以任何方式限制t
的可能值。因此,在静态方法调用中,您的T
变为unknown
。Alpha
和Beta
都可以有T
的任何值,除非显式传递泛型参数,否则您无法知道使用create()
创建的实例上T
的值是多少
下面是将显式泛型参数传递给create()
时的情况:
或者您可以简单地将
T
约束在Alpha
中,并将每个子类约束到特定类型:
type AlphaType<A> = A extends Alpha<infer T> ? T : never;
type A = AlphaType<typeof a> // number
阿尔法类{
静态创建(this:T):InstanceType{
将新this()作为InstanceType返回;
}
}
类Beta扩展了Alpha{}
常数a=Alpha.create();//返回阿尔法
常数b=Beta.create();//返回测试版
type InstanceType<T extends new (...args: any) => any> = T extends new (...args: any) => infer R ? R : any
class Alpha<T = string> {
// I'm giving this generic a different name to denote that it is unrelated to `T`
static create<C = string>(): Alpha<C> {
return new Alpha<C>();
}
}
const a = Alpha.create<number>(); // returns Alpha<number>
const b = Alpha.create<[]>(); // returns Alpha<[]>
const c = Alpha.create(); // return Alpha<string>
type AlphaType<A> = A extends Alpha<infer T> ? T : never;
type A = AlphaType<typeof a> // number
class Alpha<T extends string = string> {
static create<T extends typeof Alpha>(this: T): InstanceType<T> {
return new this() as InstanceType<T>;
}
}
class Beta<T extends number = number> extends Alpha {}
const a = Alpha.create(); // returns Alpha<string>
const b = Beta.create(); // returns Beta<number>