TypeScript对类型声明的顺序是否敏感?
更改类型的顺序会导致Angular 2(beta.0)中出现错误,其中(AFAIK)是使用TypeScript本身实现的(这就是为什么这个错误看起来很奇怪而且与我无关):
angular2-polyfills.js:138 Error: Cannot read property 'prototype' of undefined(…)
假设我们有一个文件t1.ts
:
export class AuthResponse extends JsonResponse { }
export class JsonResponse {
public code: ResultCode;
}
export enum ResultCode { }
启动应用时,我们会在客户端看到上述错误。但是如果我们颠倒这个文件中声明的顺序,那么错误就会消失(只是为了记录,目前我正在向前推进,记住这一点并且它有效)。
要重现此错误,我们还需要五个文件:
t2.ts
:
import {AuthResponse, JsonResponse, ResultCode} from './t1'; // this order?
export class DummyAction {
doSomething() {
console.log('test, starting ...');
var v = new AuthResponse();
return v;
}
}
app.component.ts
:
import {Component, OnInit} from 'angular2/core';
import {DummyAction} from './components/t2';
@Component({
selector: 'root-app',
templateUrl: '/app/templates/app.html',
})
export class AppComponent implements OnInit {
constructor() {
var tester = new DummyAction();
// tester.runTest();
}
ngOnInit() { }
}
app.html
:
<h1>TEST</h1>
boot.ts
:
import {bootstrap} from 'angular2/platform/browser';
import {AppComponent} from './app.component';
bootstrap(AppComponent, []);
index.html
虽然有点大,但基本上是angular网站教程中index.html
的结构。
答案 0 :(得分:12)
TypeScript本身不敏感,但编译为JS。
class A extends B {}
class B {}
在JS中:
var A = (function (_super) { /* ... */ })(B);
var B = (function () { /* ... */ })();
B在第1行未定义。
答案 1 :(得分:8)
我已经为vasa_c答案投了票,因为它是正确答案。下面我想提供一些关于这个问题的更多信息,以便OP更容易理解这个问题。
如果我们将采用您的示例代码:
export class AuthResponse extends JsonResponse { }
export class JsonResponse {
public code: ResultCode;
}
export enum ResultCode { }
并编译它 - 这就是最终结果:
var AuthResponse = (function (_super) {
__extends(AuthResponse, _super);
function AuthResponse() {
_super.apply(this, arguments);
}
return AuthResponse;
})(JsonResponse);
exports.AuthResponse = AuthResponse;
var JsonResponse = (function () {
function JsonResponse() {
}
return JsonResponse;
})();
exports.JsonResponse = JsonResponse;
(function (ResultCode) {
})(exports.ResultCode || (exports.ResultCode = {}));
var ResultCode = exports.ResultCode;
请注意,生成的代码不仅仅是函数定义。它是函数和变量。这一切都有所不同。因为你有声明和表达式。关于这个问题的更多内容以及为什么js顺序中的表达式很重要,你可以阅读这篇优秀文章:JavaScript function declaration and evaluation order