打字稿:为什么这段代码在100%有效的javascript代码时抛出异常

时间:2016-10-24 16:12:28

标签: javascript typescript

声称TypeScript是Javascript的超集。 这是关于这个的堆栈question。 这是报价的引用:

  

TypeScript是JavaScript的语法糖。 TypeScript语法是一个   ECMAScript 2015(ES2015)语法的超集。每个JavaScript程序   也是一个TypeScript程序。

所以我的理解是,任何独立的javascript文件都可以被视为有效的打字稿代码,即由tsc编译器编译(可能带有一些额外的标志)。

但这是js代码的一个例子:

class ClassA {}
ClassA.prototype.ping = () => {console.log('PING')}

这是有效的javascript,但如果您尝试使用typescript编译它,您将获得: error TS2339: Property 'ping' does not exist on type 'ClassA'

可以声明ClassA可以实现的接口,同样,编写这样的代码(组合类和原型语法)非常不典型 - 但是 - 这看起来像是一个有效的js代码的例子,它在用tsc编译时会引发错误。

所以问题是 - 这与规范的引用并不矛盾?

1 个答案:

答案 0 :(得分:5)

TypeScript是JavaScript的语法超集,不会改变JavaScript的运行时行为。因此,您在JavaScript中编写的任何表达式或语句或声明都是语法合法的TypeScript。

这并不意味着所有JS代码都被认为是无警告的TypeScript。毕竟,TypeScript的一个主要目标是识别错误的结构,如

var s = "hello world" * 423;
var t = "qzz".subtr(2);
var u = [1, 2, 3] + 5;
var w = window.navgtator;

这些都是“有效的”JavaScript表达式,它们碰巧会有人们不想实际做的不良运行时行为。

与TypeScript一样,您可以告诉类型系统有关额外信息的信息

class ClassA {}
// Declare additional method
interface ClassA { ping(): void; }
// OK
ClassA.prototype.ping = () => {console.log('PING')}