推断 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.