【问题标题】:Import into an Internal Module导入内部模块
【发布时间】:2015-05-06 14:09:28
【问题描述】:

我有一个 node.js 应用程序。与所有重要的应用程序一样,它被拆分为许多文件。为简单起见,假设有两个文件:

Base.ts

module MyNamespace {
    export class Base {}
}

Derived.ts

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

module MyNamespace {
    export class Derived extends Base {}
}

在 TypeScript 的术语中,它们是内部模块。现在,我想在文件 Derived.ts 中使用 node.js 模块。天真的方法是只导入它。

/// <reference path="Base.ts" />
/// <reference path="node.d.ts" />

import fs = require('fs');

module MyNamespace {
    export class Derived extends Base {
        stats: fs.Stats;
    }
}

但是,如果我们尝试编译此代码,我们将收到错误 2304 Cannot find name 'Base'。发生这种情况是因为包含顶级import 或export 的模块是外部模块,并且外部模块不能跨文件传播;换句话说,它们是密封的,因为它在 Scala、C# 以及也许在其他地方被调用。反过来,这意味着文件Base.ts 不再对MyNamespace 有贡献。尽管我相信拥有一个公共命名空间并能够依赖其他外部模块是完全合理的愿望。

我尝试了一些解决方法,但没有一个是完美的。

  • 使用var 而不是import。 没有顶级导入意味着模块不会成为外部模块。但是,如果我们使用 var 导入模块,我们将无法在类型位置使用它,只能在值位置使用它。

  • 将所有模块设为外部。 基本上,我们会删除命名空间,而不是使用import 语句来引用依赖于它们的文件中的其他模块。就像好老#include。除了必须做大量的要求之外,这意味着每个模块都编译成一个单独的文件,现在要加载应用程序,我们需要读取很多文件而不是一个文件。

  • 将所有内容保存在一个文件中。解决了外部模块的密封性问题(有这个词吗?)。这对小程序很有用,但是文件超过 1000 行代码就会变得难以管理。

  • 创建一个包装器。如果您只有几个模块要导入,而且它们很小,您可以使用var 导入它们,并创建委派功能的包装器.显然,这不是最干净的解决方案,并且随着模块数量的增加变得很麻烦。

所以,我的问题是如何正确地将 node.js 模块导入到包含分布在多个文件中的内部 TypeScript 模块的文件中。另外,我想了解为什么不能采用我的第一个天真的方法。

【问题讨论】:

    标签: typescript


    【解决方案1】:

    我的个人建议是您的选项 2。

    将所有模块设为外部

    这就是节点设置运行的方式,所以不要抗拒它。是的,它会在您运行应用程序时从本地磁盘加载文件,但它也被设置为优化对相同资源的后续请求。

    每个文件代表一个模块,因此您不需要在应用程序中使用module 关键字(并且您不需要任何reference cmets - 只需import 语句)。如果您希望使用文件夹结构,您可以创建一个层次结构,尽管我更喜欢高而不是深的结构。

    【讨论】:

    • 这个选项还有一个问题。您不能使用 export = 语法导出接口。这意味着,导入它的模块必须使用限定名称:import interface = require('Interface'); interface.Interface。
    • 如果你想使用短名称,你可以给它起别名:type IExample = ModuleName.IExample; 然后你可以简单地使用:var x: IExample;
    • 不应该是import而不是type吗?
    • type 表达式在 import 之后,因此您可以导入它,然后您可以将长类型名称与本地短名称命名。
    • 我明白这一点,但根据维基,import 也用于别名。 github.com/Microsoft/TypeScript/wiki/Modules#alias 。出于某种原因,我认为您将它与 Haskell 类型的同义词混淆了。
    猜你喜欢
    • 1970-01-01
    • 2019-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-16
    • 1970-01-01
    • 2013-07-10
    相关资源
    最近更新 更多