TypeScript中是否有类似于Java中Class的东西< T>来提取类构造函数的类型?

k4ymrczo  于 2022-12-14  发布在  TypeScript
关注(0)|答案(1)|浏览(148)

我需要这样一个特性,如Java中的Class for TypeScript,但我一直无法找到它。
Class<T>是我要找的。我想它可能是NewableFunction<T>。但是没有这样的东西。我不能用Map<A, InstanceType<A>>,显然它不正确。
“setIt”方法和“left end of this Map”只传递类A的类型和类A的子类,而不传递其示例或不是A子类的类。
我知道Typescript编译为Javascript时会擦除类型,就像Java一样。

class Foo {
  public static readonly bar : Map<Class<A>, A>;

  public static declare getIt(clazz: Class<A>) : A;

  public static setIt(clazz: Class<A>) : A {
    const a = new clazz();
    this.bar.set(clazz, a);
    return a;
  }
}

declare class A;
declare class B extends A;

字典的左边是它的类,右边是对应类的对象。
还有协变和逆变类的声明呢?
如“进”和“出”是Kotlin的关键词。
我也在找那个。

class Foo{
  public map: Map<Class<in A>, A>
  public setIt(clazz: Class<in A>): A;
}

我搜索了它,也看了官方文档,包括stdlib的类型声明,但没有得到任何结果。

zfycwa2u

zfycwa2u1#

关于你的第一个问题,是的。如果你用

class A {}

那么你有两件事:实际的A,它是一个构造函数(一种函数),以及类型A,它类型化了A* 的 * 示例。
但是,您可以使用**typeof A**获得构造函数的类型(存储在A中的实际内容)。
在您的示例中,转换为TypeScript,您将获得:

const foo = {
  bar : new Map<typeof A, A>(),

  getIt(clazz: typeof A) : A | undefined {
    return this.bar.get(clazz)
  },

  setIt(clazz: typeof A) : A {
    const a = new clazz()
    this.bar.set(clazz, a)
    return a
  }
}

我将类Foo转换为一个基本对象,因为它只有静态属性,在TypeScript中作为类没有意义。

相关问题