在搜索我遇到的问题时,我发现声称有the declaration order of classes doesn't matter in Typescript,并且“前向声明”不是必需的。
在我正在审查的一个项目中,这一说法似乎没有成功。我将问题分解为一个简单的可重现的示例,即使编译器没有抱怨,我们也会在运行时失败:
$ cat bug.ts
class A extends B {
constructor(public id:number) {
super(id);
console.log("A():" + id);
}
}
class B {
constructor(public id:number) {
console.log("B():" + id);
}
}
var a = new A(12);
$ tsc bug.ts
$ node bug.js
/home/ttsiod/work/a/bug.js:4
__.prototype = b.prototype;
^
TypeError: Cannot read property 'prototype' of undefined
at __extends (/home/ttsiod/work/a/bug.js:4:21)
at /home/ttsiod/work/a/bug.js:8:5
at Object.<anonymous> (/home/ttsiod/work/a/bug.js:15:3)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Function.Module.runMain (module.js:497:10)
at startup (node.js:119:16)
at node.js:901:3
我错过了一个我不知道的关键词,或者“声明顺序不重要”的说法并不像人们想象的那样通用。
答案 0 :(得分:3)
我对继承很重要。只要在使用之前定义 就没关系,这就是您提到的链接中的情况。
对于继承,B必须在A之前定义,以便A可以复制B原型中的成员。
“声明”(订单从不重要)和“定义”之间存在区别,其中订单几乎总是重要的,除了吊装http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html等案件