【问题标题】:TypeScript class per file in same namespace in Node.jsNode.js 中同一命名空间中每个文件的 TypeScript 类
【发布时间】:2019-07-22 13:29:26
【问题描述】:

当多个类(因此是多个文件)贡献于同一个命名空间时,每个文件一个类的模式是什么?我在 Node.js 上下文中专门问这个问题。

我知道如何在同一个命名空间中为每个文件定义一个类:

foo/A.ts:

module foo {
    export class A {
    }
}

foo/B.ts:

module foo {
    export class B {
    }
}

main.ts:

/// <reference path="./foo/A.ts"/>
/// <reference path="./foo/B.ts"/>

// TODO: How do I import the foo namespace at runtime?

TypeScript 被认为是一种用于应用程序规模的 JavaScript 开发的语言,但我们似乎在 应用程序规模开发的最基本方面被冷落,即如何布局和结构代码文件以及在运行时如何将所有内容链接在一起。

【问题讨论】:

    标签: node.js typescript


    【解决方案1】:

    nodejs 中,每个文件 都是一个模块。当您为 nodejs 编写代码时,不需要使用 module(打字稿称为 internal 模块)。

    文件A中的foo实际上是A.foo,文件B中的foo实际上是B.foo。这就是 nodejs 的工作方式。 Typescript 遵循 nodejs 中的常规内容。

    有关外部与内部模块的更多信息:http://www.youtube.com/watch?v=KDrWLMUY0R0&hd=1

    PS 关于:

    应用规模开发的最基本方面

    基本在浏览器中,而不是在 nodejs 中。 nodejs 中没有 全局作用域,就像浏览器中那样。

    【讨论】:

    • 谢谢,但我认为在 Node.js 中不需要模块的说法没有抓住问题的重点。我想使用命名空间,module 是 TypeScript 的方法。如果模块不能在 Node.js 中使用,那么 TypeScript 就不能用于 Node.js 的“应用程序级开发”。 “应用程序级开发的最基本方面”是指一般而言,如 Java 和 C# 等语言中所见,这两种语言都有一个命名空间/包系统,可以促进应用程序级开发的最基本方面。
    • 我以前看过这个视频,现在也看了。谢谢。我认为您正在使用--out 选项。我会看看它是如何工作的......
    【解决方案2】:

    正如 basarat 所说,在 Node.js 中,文件是模块。编写您正在编写的代码的正确方法是:

    foo/A.ts:

    class A {
    }
    
    export = A;
    

    foo/B.ts:

    class B {
    }
    
    export = B;
    

    main.ts:

    import A = require('./foo/A');
    import B = require('./foo/B');
    

    这在The Definitive Guide to TypeScript 的导入和导出部分中有详细说明。

    【讨论】:

    • 这没有回答所提出的问题。随意删除。
    • 这怎么不能回答问题?您的“命名空间”foo目录名称定义。这就是 Node.js 的工作方式,这就是 AMD 的工作方式。仅仅因为您目前不了解内部模块和外部模块之间的区别并不意味着答案是错误的……
    • 它没有回答这个问题,因为我专门询问了如何使用包含多个类的命名空间来实现每个文件的类,因此跨多个文件定义一个命名空间。
    • 我不确定我还能如何解释这一点。您想要的不是模块在 Node.js 中的工作方式。您正在尝试将方形钉楔入圆孔中。这不是命名空间在 Node.js 中的工作方式。如果你正在编写正确的 Node.js 代码,你就不会做你正在做的事情。当您在 Node.js、AMD 或任何其他现代模块系统中“命名空间”代码时,您应该使用 basarat 和我都描述的模式。
    • 解锁成就:方钉放入圆孔中。看我的回答。
    【解决方案3】:

    如果使用 --out 选项将所有 TypeScript 文件编译为单个 JavaScript 文件,这将起作用。不需要进一步的代码。如果没有这个选项,main.js(来自 main.ts)将看不到模块 foo 并且会抛出 ReferenceError

    感谢 Basarat 链接到他推荐 --out 选项的视频之一:http://www.youtube.com/watch?v=KDrWLMUY0R0&hd=1

    【讨论】:

    • 不要这样做 - 这个答案解决了作者的模块设计,它本身就是 node.js 中完全可接受的模块系统的混蛋。它“有效”,但不合适。 C Snover 的回答是正确的建议。
    【解决方案4】:

    聚会有点晚了,但我写了一个 grunt 插件,让您可以在 node 中使用 file-per-class/AMD 编程风格,并为 AMD(浏览器)和 CommonJS(node)编译该代码,同时避免使用像 requireJS 这样的客户端垫片。

    https://www.npmjs.org/package/grunt-contrib-serverify-ts

    在这个阶段它有点粗糙和准备好了,但它对我来说是一个相当复杂的项目。

    【讨论】:

    • +1 表示有趣的方法。但它对 IDE 不友好
    • @xmojmr 在我的 IDE (Visual Studio) 中工作正常,它认为一切都是 AMD 模块(必须以 AMD 样式重写一些 CommonJS d.ts 文件来愚弄它),但它不是特别是调试器、映射文件或堆栈跟踪友好:D.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 2017-01-26
    • 1970-01-01
    相关资源
    最近更新 更多