【问题标题】:Where does the "use strict" go when using TypeScript and AMD Modules使用 TypeScript 和 AMD 模块时“使用严格”在哪里
【发布时间】:2014-10-16 17:49:37
【问题描述】:

我使用的是 TypeScript 版本 1.0.1.0

当同时使用 TypeScript 和 AMD 模块时,我应该在哪里写“use strict”语句?它应该高于还是低于进口?

我可以把它写在imports上面,这样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 中的错误吗?

【问题讨论】:

    标签: requirejs typescript amd


    【解决方案1】:

    第一个变体导致整个脚本的严格性:

    "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;
    

    在实践中,这对您的情况几乎没有什么影响,因为它只是严格声明(包括自动生成的“扩展”代码与否)之间的区别 - 并且自动生成的代码是严格兼容的。

    【讨论】:

    • 对 TSLint 有什么看法?在我看来,这应该作为“使用严格”违规的一部分进行验证。
    • 如果 TSLint 有任何问题,我会感到惊讶。我认为规则是 "use strict" 应该位于模块的顶层 - 所以它取决于 TSLint 对“顶层”的确切定义。
    • @Fenton "自动生成的代码是严格兼容的。",实际上不是,extends 助手中的this.constructor = d 行将静默失败,.constructor 属性不可分配在严格模式下。
    猜你喜欢
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    • 1970-01-01
    • 2015-12-27
    • 2012-10-12
    • 1970-01-01
    相关资源
    最近更新 更多