Где "использовать строгую" при использовании TypeScript и AMD модулей

Я использую TypeScript версию 1.0.1.0

При использовании TypeScript и модулей AMD вместе, где именно следует писать инструкцию "use strict"? Должна ли она превышать или ниже импорта?

Я могу написать это над импортом, так что этот TypeScript код:

"use strict";
import Backbone = require('backbone');
class MyClass extends Backbone.View<Backbone.Model> { }
export = MyClass;

приводит к этому JavaScript с выражением в верхней части файла:

"use strict";
var __extends = this.__extends || function (d, b) {
    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
    function __() { this.constructor = d; }
    __.prototype = b.prototype;
    d.prototype = new __();
};
define(["require", "exports", 'backbone'], function(require, exports, Backbone) {
    var MyClass = (function (_super) {
        __extends(MyClass, _super);
        function MyClass() { _super.apply(this, arguments); }
        return MyClass;
    })(Backbone.View);
    return MyClass;
});

Или я могу поставить инструкцию "use strict" ниже моего импорта. Чтобы этот TypeScript:

import Backbone = require('backbone');
"use strict";
class MyClass extends Backbone.View<Backbone.Model> { }
export = MyClass;

Результаты в этом Javascript с инструкцией в верхней части объявления функции RequireJS:

var __extends = this.__extends || function (d, b) {
    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
    function __() { this.constructor = d; }
    __.prototype = b.prototype;
    d.prototype = new __();
};
define(["require", "exports", 'backbone'], function(require, exports, Backbone) {
    "use strict";
    var MyClass = (function (_super) {
        __extends(MyClass, _super);
        function MyClass() { _super.apply(this, arguments); }
        return MyClass;
    })(Backbone.View);
    return MyClass;
});

Какой из них правильный? TSLint не сообщает о нарушении, даже если выражение полностью отсутствует. Возможно, это ошибка в TSLint?

Ответ 1

Первая вариация приводит к строгости script:

"use strict";
import Backbone = require('backbone');
class MyClass extends Backbone.View<Backbone.Model> { }
export = MyClass;

Второй ограничивает область строгости только функцией (сгенерированной):

import Backbone = require('backbone');
"use strict";
class MyClass extends Backbone.View<Backbone.Model> { }
export = MyClass;

На практике это мало влияет на ваш случай, так как это только различие между строгим объявлением, включая автоматически сгенерированный код "extends" или нет, и автоматически сгенерированный код является строго совместимым.