【问题标题】:I cannot get modules inside of modules to work when split across multiple files in typescript在打字稿中拆分多个文件时,我无法让模块内部的模块工作
【发布时间】:2012-11-08 13:17:25
【问题描述】:

相关问题:

My previous question 1

My previous question 2

我最近将我的代码从具有静态方法的类更改为使用模块和导出函数的代码。这是我以前的一个例子:

Inner 1.ts
/// <reference path="../typescript/reference.ts" />
module Outer {
    class Inner1 {
        static mvcOnFailure(message: string) {
            var a = 1;
        }
    }
}
Inner 2.ts
/// <reference path="../typescript/reference.ts" />
module Outer {
    class Inner2{
        static mvcOnFailure(message: string) {
            var b = 1;
        }
    }
}

这编译成 .js 没有问题。我有一个名为 Admin 的外部模块,然后在内部有另一个名为 Dialog 的模块和另一个名为 Grid 的模块。但是,当我尝试使用私有静态函数时,我注意到虽然在智能感知中函数旁边出现了一个锁,但该函数并不是真正私有的并且可以访问。为了解决这个问题,有人建议我应该尝试使用模块而不是类,所以我编码如下:

Inner 1.ts
/// <reference path="../typescript/reference.ts" />
module Outer {
    export module Inner1 {
        export function mvcOnFailure(message: string) {
            var a = 1;
        }
    }
}

Inner 2.ts
/// <reference path="../typescript/reference.ts" />
module Outer {
    export module Inner2{
        export function mvcOnFailure(message: string) {
            var b = 1;
        }
    }
}

reference.ts
/// <reference path="../Outer/Inner2.ts" />
/// <reference path="../Outer/Inner1.ts" />

编译时我遇到了一个大问题,因为现在每个 .js 都有 外部模块中的所有功能如下:

Inner 1.js

var Outer;
(function (Outer) {
    (function (Inner1) {
        function mvcOnFailure(message) {
            var a = 1;
        }
        Inner1.mvcOnFailure = mvcOnFailure;
    })(Outer.Inner1 || (Outer.Inner1 = {}));
    var Inner1 = Outer.Inner1;
})(Outer || (Outer = {}));

var Outer;
(function (Outer) {
    (function (Inner2) {
        function mvcOnFailure(message) {
            var b = 1;
        }
        Inner2.mvcOnFailure = mvcOnFailure;
    })(Outer.Inner2 || (Outer.Inner2 = {}));
    var Inner2 = Outer.Inner2;
})(Outer || (Outer = {}));

是时候放弃这个想法了,就好像我在多个 .ts 文件中拥有同一个模块的部分功能,然后它会将所有内容添加到 .js 中。

更新:

对此不确定。现在看来问题可能与我安装了网络必需品有关。我禁用了它,现在我没有遇到来自一个文件的函数出现在其他文件的 java 脚本中的问题。这是否与 web Essentials 在保存时进行编译的方式有关。我读了一些地方,应该一次为所有文件编译打字稿,而不是一次只编译一个文件。对吗?

【问题讨论】:

  • 我认为你遇到了和 Wouter 一样的问题:stackoverflow.com/questions/13461758/…
  • @Steve - 谢谢史蒂夫。是的,它看起来确实是同样的问题。我禁用了 Web Essentials,在构建之前添加到编译行中,您之前建议过,现在一切正常。希望得到一些关于网络必需品的确认,然后我可以再次开始使用它。顺便说一句,您是否看到我关于用模块替换静态函数的类的问题?只是想知道您是否也认为模块是更好的解决方案。谢谢。
  • 视情况而定。在我下定决心之前,我可能需要一个具体的例子来说明你在做什么。一般来说,尽管是 TypeScript 中的模块和类为您提供了代码组织。
  • @Steve - 这是我想要实现的目标。我知道这只是一个小例子:stackoverflow.com/questions/13468451/… 所有这些代码都是无状态的。例如打开对话窗口或将事件附加到网页上的控件。
  • 我会说,因为你有一个“普通”模式的功能和一个“管理”模式的功能,所以有一些空间可以容纳一个通用的“模式”类,它的专业化继承自它 - 而不是调用不同的函数来使其正常或管理。

标签: javascript typescript


【解决方案1】:

作为对此的跟进,TypeScript 0.9 alpha 预览版(不稳定,但正在开发中)包含对模块的更改,这将使跨多个文件定义模块变得更加容易。

来自0.9 breaking changes wiki page

“模块”关键字不再创建类型说明:在 0.9.0 中,一个 命名空间、类型和角色之间的区别更加清晰 价值观。模块现在只对命名空间和值有贡献,并且将 不再贡献类型。原因:这个角色的简化 的模块允许模块现在更多地扩展类和功能 很容易。

这可能对您的问题有所帮助,但您必须尝试看看是否有效。

【讨论】:

    猜你喜欢
    • 2021-12-31
    • 2020-01-17
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    • 2015-07-15
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    相关资源
    最近更新 更多