Типовой декларационный заказ в TypeScript

Является ли 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, который немного больше, но по существу, имеет структуру index.html из учебника на angular веб-сайте.

Ответы

Ответ 1

TypeScript сам не чувствителен, но скомпилирован для JS.

class A extends B {}
class B {}

В JS:

var A = (function (_super) { /* ... */ })(B);
var B = (function () { /* ... */  })();

B undefined в строке 1.

Ответ 2

Я отдал свой голос за ответ 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 и порядок оценки