使用Javascript中的Typescript模块

L. *_*ire 16 javascript typescript webpack

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

可以说,它包含各含有单个类,3个模块A,BC.

A.ts:

export default class A {
    /* things */
}
Run Code Online (Sandbox Code Playgroud)

B.ts:

export default class B {
    /* things */
}
Run Code Online (Sandbox Code Playgroud)

C.ts:

export default class C {
    /* things */
}
Run Code Online (Sandbox Code Playgroud)

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

<script src="dist.js"></script>
<script>
    var foo = new LettersLibrary.A();
</script>
Run Code Online (Sandbox Code Playgroud)

我将如何做到这一点,最终的目标是能够开发利用打字稿模块,但提供一个可从vanilla js使用的库.

Nik*_*xDa 10

为此使用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;
  }
}
Run Code Online (Sandbox Code Playgroud)

在JavaScript中,您将执行以下操作:

const instance = new LettersLibrary.A ();
console.log (instance.hello); // "Hello World"
Run Code Online (Sandbox Code Playgroud)

如果需要从其他文件重新导出类,只需将导入的类导出为const 和type(对于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
}
Run Code Online (Sandbox Code Playgroud)

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

感谢@Ghabriel Nunes,他告诉我module现在名为namespaces.

  • "外部模块只是模块"意味着你只需要"导出"你想要的任何类/变量,而不是将它们包装在`命名空间`中.`module`关键字本身完全等同于`namespace`.见[这里](https://fizzylogic.nl/2016/02/07/typescript-internal-vs-external-modules/) (4认同)