当你写的时候class
声明如
class A { a = 1 }
在 TypeScript 中,您正在引入范围两个不同的东西两者都被命名为A
。其一是value named A
,运行时存在的类构造函数。另一个是type named A
,对应于类实例的TypeScript接口;此类类型在运行时不存在。
还要注意一个值has一种类型,但它本身并不是一种类型。以及类型A
值不是A
,因为类构造函数本身不是类的实例)。相反,它具有类型typeof A
(用表示TypeScript 的typeof类型查询运算符),这类似于类型new () => A
(用构造签名).
事实上,值和类型都已命名A
很方便但是很混乱。它很方便,因为它可以让您使用一个术语A
指代相关但不同的事物,而不需要您为每个事物发明新的术语(例如,A
对于类构造函数,但是InstanceA
对于实例类型)。但这很令人困惑,因为它可能会给人一种错误的印象,即这两件事实际上是一件事,或者这两件事之间的关系在某种程度上是名称中固有的,而实际上这只是偶然的。
另一方面,当您编写变量声明时,例如
const B = class extends A { b = 2 };
你只是将a纳入范围value named B
。没有对应的type named B
。如果你想要这样的类型,你必须自己声明它:
type B = InstanceType<typeof B>;
缺少名为的自动类型B
不是因为编译器无法弄清楚B
是一个类构造函数。编译器确切地知道什么B
is:
// const B: typeof B
它知道它构建了B
实例:
type WhatBConstructs = InstanceType<typeof B>;
// type WhatBConstructs = B // this "B" is not an actual type name, btw
(这里我用了the InstanceType<T>实用型探测的类型B
其实例类型的构造函数。)
只是变量声明命名了新值而不是新类型。
现有的建议位于微软/TypeScript#36348它要求当您将类构造函数绑定到变量时,它还应该创建一个与实例类型相对应的命名类型。如果要实施这一点,那么您的B
当你写的时候会出现类型const B = class extends A {...}
。如果你想看到这种情况发生,你可以去那里给它一个
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)