【问题标题】:Using Typescript Modules from Javascript在 Javascript 中使用 Typescript 模块
【发布时间】:2018-05-28 15:11:00
【问题描述】:

我想使用 Typescript 模块创建一个项目,但允许它从 vanilla javascript 中使用。

假设它包含 3 个模块,每个模块包含一个类,ABC

A.ts:

export default class A {
    /* things */
}

B.ts:

export default class B {
    /* things */
}

C.ts:

export default class C {
    /* things */
}

所有这些都使用 webpack 构建并捆绑到一个 dist.js 文件中。我希望图书馆的用户能够做类似的事情

<script src="dist.js"></script>
<script>
    var foo = new LettersLibrary.A();
</script>

我将如何去做,最终目标是能够利用 typescript 模块进行开发,但提供一个可从 vanilla js 使用的库。

【问题讨论】:

  • 您可以考虑避免使用自 es6 brings modules natively 以来的任何打字稿自定义模块或命名空间。只要符合 es 标准即可。

标签: javascript typescript webpack


【解决方案1】:

为此使用 TypeScript 命名空间。您可以在其中声明您的类,然后从模块内部导出它们。然后,您的用户将能够按照您的意愿使用它。

https://www.typescriptlang.org/docs/handbook/namespaces.html

例子:

namespace LettersLibrary {
  export class A {
    hello = "Hello World";
  }

  export class B {
    myBool = false;
  }

  export class C {
    someInt = 42;
  }
}

在 JavaScript 中,你会这样做:

const instance = new LettersLibrary.A ();
console.log (instance.hello); // "Hello World"

如果你需要从其他文件重新导出类,只需将导入的类导出为 const 和类型(对于 TypeScript 开发很有用,否则你将无法使用模块中的类型):

import importA from "...";
import importB from "...";
import importC from "...";

namespace LettersLibrary {
    export const A = importA;
    export type A = importA;

    // Same for B and C
}

使用 WebPack 时,您必须将其导出为库。为此,您可以将libraryExport 配置与librarylibraryTarget 选项一起使用。见:https://webpack.js.org/configuration/output/#output-libraryexport

感谢@Ghabriel Nunes,他告诉我modules 现在改名为namespaces。

【讨论】:

  • 当然。只需导入您需要的类,然后结合使用export const A = A;export type A = A; 即可拥有功能齐全的重新导出类。我已经更新了我的答案。
  • @GhabrielNunes 据我所知,这并不完全正确。内部模块现在是命名空间,而外部模块只是模块。至少 TypeScript 官方网站是这么说的。
  • external modules are just modules 意味着您只需 export 直接使用您想要的任何类/变量,而不是将它们包装在 namespace 中。 module 关键字本身完全等同于namespace。见here
  • 这不是 TypeScript,而是 WebPack 问题。您可以配置 WebPack 以使您的代码可用作库,如下所述:stackoverflow.com/questions/34357489/…
  • libraryTarget: 'var'library: 'LettersLibrary 添加到输出允许我访问LettersLibrary' from javascript, but A, B, and C` 仍然未定义。编辑:它有效,我只需要执行 LettersLibrary.LettersLibrary.A,我将删除根据此答案创建的命名空间,希望它有效
猜你喜欢
  • 2021-01-12
  • 2016-07-18
  • 2012-09-28
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2016-08-30
  • 2022-01-14
  • 1970-01-01
相关资源
最近更新 更多