Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 如何使用泛型访问typeof类_Typescript - Fatal编程技术网

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>