typescript - 如何正确键入返回 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
解决方案
一个类声明产生一个类型和一个值。该值是类的构造函数(这就是为什么在编写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();
类型的值位于不同的域中,因此使用相同的名称就可以了。
不幸的是,没有办法在单个语句中做到这一点,这涉及到一些冗长。
推荐阅读
- javascript - javascript中带有箭头的标记对象有什么不同?
- yocto - 添加对 systemd-udevd.service 的更改
- java - 在 java android 中使用 dagger2 在自定义/实用程序类中注入 AndroidInjection 的位置
- asp.net-mvc - tootltip 的数据绑定在 asp.net _knockout Web 应用程序中不起作用
- ecmascript-6 - 在 jquery 初始化中出现错误。未捕获的类型错误:无法在(索引)处设置未定义的属性“jquery”:27
- gradle - 将多模块 Gradle 库打包到单个模块中
- c++ - 循环并使用数字的索引作为文件名
- metal - 金属渲染通道中没有颜色附件
- java - 如何使用部件获取多部件/表单数据的参数
- python - 在谷歌云数据流中刷新访问令牌时 GRPC 状态运行时异常