推断 TypeScript 泛型 class 类型
Infer TypeScript generic class type
B 扩展了泛型 class A。我需要能够推断出 B 的扩展 A 的泛型类型。请参见下面的代码。
我在以前的 Typescript 版本中成功地使用了它,但对于我当前使用 3.2.4 的项目(也尝试了最新的 3.4.5),推断类型似乎导致 {}
而不是 string
。
知道我做错了什么吗?这不可能已经改变了?
class A<T> {
}
class B extends A<string> {
}
type GenericOf<T> = T extends A<infer X> ? X : never;
type t = GenericOf<B>; // results in {}, expected string
好吧,nvm 经过大量研究后自己弄明白了。似乎 TypeScript 无法在这种简单的情况下进行区分,因为那些 类 都是空的并且等同于 {}
。添加属性实际上是不够的,它需要是实际引用泛型的属性 T
以便 TypeScript 稍后正确推断泛型类型:
class A<T> {
constructor(public a: T) {}
}
class B extends A<C> {
constructor(public b: C) {
super(b);
}
}
class C {
constructor(public c: string) {
}
}
type GenericOf<T> = T extends A<infer X> ? X : never;
type t = GenericOf<B>;
目前 class 拥有一个未在 class 中使用的泛型,其字面上的 "structure" 与 {}
相同,因此推断。破坏您的功能的更改是错误修复,解决方法是在 class 内的某处使用 "A's" 泛型,推理将再次起作用。
希望对您有所帮助。
class A<T> {
hello: T = "" as any; // note that i have used the generic somewhere in the class body.
}
class B extends A<string> {}
type GenericOf<T> = T extends A<infer X> ? X : never;
type t = GenericOf<B>; // string.
B 扩展了泛型 class A。我需要能够推断出 B 的扩展 A 的泛型类型。请参见下面的代码。
我在以前的 Typescript 版本中成功地使用了它,但对于我当前使用 3.2.4 的项目(也尝试了最新的 3.4.5),推断类型似乎导致 {}
而不是 string
。
知道我做错了什么吗?这不可能已经改变了?
class A<T> {
}
class B extends A<string> {
}
type GenericOf<T> = T extends A<infer X> ? X : never;
type t = GenericOf<B>; // results in {}, expected string
好吧,nvm 经过大量研究后自己弄明白了。似乎 TypeScript 无法在这种简单的情况下进行区分,因为那些 类 都是空的并且等同于 {}
。添加属性实际上是不够的,它需要是实际引用泛型的属性 T
以便 TypeScript 稍后正确推断泛型类型:
class A<T> {
constructor(public a: T) {}
}
class B extends A<C> {
constructor(public b: C) {
super(b);
}
}
class C {
constructor(public c: string) {
}
}
type GenericOf<T> = T extends A<infer X> ? X : never;
type t = GenericOf<B>;
目前 class 拥有一个未在 class 中使用的泛型,其字面上的 "structure" 与 {}
相同,因此推断。破坏您的功能的更改是错误修复,解决方法是在 class 内的某处使用 "A's" 泛型,推理将再次起作用。
希望对您有所帮助。
class A<T> {
hello: T = "" as any; // note that i have used the generic somewhere in the class body.
}
class B extends A<string> {}
type GenericOf<T> = T extends A<infer X> ? X : never;
type t = GenericOf<B>; // string.