【问题标题】:Reference module exported using “export =” in TypeScript在 TypeScript 中使用“export =”导出的引用模块
【发布时间】:2013-09-01 21:20:29
【问题描述】:

从 TypeScript 0.9 开始,您可以直接使用 export = 设置模块的导出值:

// client.ts 
class Client { 
    constructor(public name: string, public description: string) { } 
} 
export = Client; 

有没有办法使用/// <reference ... /> 引用Client

以下不公开Client 类:

/// <reference path="./client.ts" />

class SomeClass {
    addClient(client: Client) { // Could not find symbol 'Client'
        ...
    }
}

我想这是预期的行为,因为我正在导出对Client 类的直接引用,因此该模块基本上是匿名的。但是在上面的类中,我实际上并没有实例化一个新的Client,所以添加import Client = require('Client'); 会让AMD 加载程序加载client.js,即使如果从未调用过addClient 就不需要它。

所以我希望得到类似的东西:

/// <reference path="./client.ts" export="Client" />

export 是分配模块的名称。

【问题讨论】:

  • 当你使用export =时,它被编译成一个AMD模块。然后它是一个“外部”模块,您必须使用import foo = require("bar"); 语法来导入它。 JavaScript(以及 TypeScript)无法检测是否实际使用了 Client,因此 require 调用将是文件级的。如果你想拥有这样的灵活性,在.d.ts类型定义文件中声明一个Client接口,然后&lt;reference&gt;它。
  • 是的,我想(除了导入 Client)这是唯一的选择,谢谢。

标签: typescript amd


【解决方案1】:

当您在文件级别导出某些内容时,/// &lt;reference ... / 不起作用(在打字稿文档中称为 external modules

修改你的代码为:

// client.ts 
class Client { 
    constructor(public name: string, public description: string) { } 
} 
// Remove this line export = Client; 

进一步说明:在文件根级别导出任何内容后访问文件中项目的唯一方法是通过import/require 组合。

PS:我制作了一个关于内部/外部打字稿模块的视频:http://www.youtube.com/watch?v=KDrWLMUY0R0&hd=1

【讨论】:

  • 是的,我正在使用 requirejs。通过使用export = ,我可以防止在全局范围内定义任何内容。我注意到我提供了一个不好的例子,我创建了一个Client 的新实例,在这种情况下它实际上需要导入。我编辑了我的问题以提供一个可能不需要Client 的情况。
  • 哦,顺便说一句,我确实在 YouTube 上观看了您关于该主题的 2 个视频。他们确实帮助我了解了 TypeScript 模块的工作原理,谢谢!
  • 谢谢。使我的回答更加明确“在文件根级别导出任何内容后访问文件中项目的唯一方法是通过导入/要求组合”。您可以做的是将类移动到没有导出的第三个文件,然后从那里使用它
  • 所以我将Client 分配给参数client 的唯一方法是添加导入?这意味着 requirejs 将始终在加载 SomeClass 时加载 Client,即使这可能不是必需的。
  • 是的。作为一个外部模块创建一个命名空间,你只能通过 require 导入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-07
  • 1970-01-01
  • 2020-03-22
  • 2022-01-08
  • 2015-05-03
相关资源
最近更新 更多