首页 > 解决方案 > 如何正确键入返回 TypeScript 中的类的函数?

问题描述

在 TypeScript 中,class关键字同时引入了值和类型:

class Plain { };
const plain: Plain = new Plain();

有没有办法让函数返回既是类型又是值的东西?

问这个问题的另一种方法是:有没有办法声明createClass下面的类型以便进行const a2: Animal = new Animal()类型检查?

declare function createClass<T extends string>(t: T): (new () => { type: T });

const Animal = createClass("animal");

const a1         = new Animal();
const a2: Animal = new Animal(); // Error: 'Animal' refers to a value, but is being used as a type here.
const a3: InstanceType<typeof Animal> = new Animal(); // OK but verbose, even if I make a type alias

看到这个 TypeScript Playground

标签: typescript

解决方案


一个类声明产生一个类型和一个值。该值是类的构造函数(这就是为什么在编写new Plain()表达式时调用构造函数的原因)。类型,与类同名,代表类的实例类型(这就是你可以在类型注解中使用它的原因)

const另一方面,A只是一个值,即使它确实包含一个类。没有对应的类型。实现与类声明类似功能的唯一方法是创建具有相同名称的类型别名。

declare function createClass<T extends string>(t: T): (new () => { type: T });

const Animal = createClass("animal");
type Animal = InstanceType<typeof Animal>

const a1         = new Animal(); 
const a2: Animal = new Animal(); 

类型的值位于不同的域中,因此使用相同的名称就可以了。

不幸的是,没有办法在单个语句中做到这一点,这涉及到一些冗长。


推荐阅读