【发布时间】:2021-05-26 02:21:26
【问题描述】:
这适用于 Javascript 和 Typescript:
class A { /* ... */ }
const B = class extends A { /* ... */ }
var x = new B();
console.log(x instanceof B, x.constructor.name); // true B
但如果我尝试将x 的类型声明为B:
var x: B = new B();
我收到打字稿错误:
'B' 指的是一个值,但在这里被用作一个类型。您的意思是“typeof B”吗?
(请注意,如果我将 const B = class extends A { /* ... */ } 替换为简单的 const B = A,我也会得到同样的错误,这是我最初为了使事情尽可能简单而进行的,但在审查时更新了)。
我真的不明白为什么会这样。根据运行时 Javascript x是一个B(如上面的console.log所示)。而且所有类都是对象(“值”)无论如何(Typescript 文档本身将类等同于"constuctor objects")。我猜这只是 Typescript 静态分析的一个限制 - 它无法弄清楚“B”是一个构造函数对象,就像“A”一样并追踪它的类型?
而且,我不这么认为,但我想知道,实际上有没有办法在 Typescript 中进行这项工作 - 知道 B 是像 A 一样的构造函数对象并允许将 B 用作类型??
附:我意识到有很多关于 SO 的问题与 “Blah 指的是一个值,但在这里被用作一种类型。你的意思是 'typeof Blah' 吗?”,但我找不到问答像上面一样直接接近它。如果我错过了,请道歉。
【问题讨论】:
-
console.log(x instanceof B, x.constructor.name === 'B'); // true true如果未编译为打字稿,则实际上返回“true false”。所以“这在 TypeScript 和 JavaScript 中都有效”有点误导。如果它在编译时返回“true true”,则编译器做错了。 -
这也是 TypeScript 中的
true false。问题只是错误,应该删除该行。 -
@traktor 你的权利,哎呀!该代码被归结为实际有用代码的最低限度。有一个稍微不同的情况,我们得到真实的,真实的。我会更新以删除或更清楚。
标签: javascript typescript