从 TypeScript 导入 CommonJS 的最向前兼容的方式是什么?

What is the most forwards-compatible way of importing CommonJS from TypeScript?

从 TypeScript 导入 CommonJS 模块的这三种方式中:

  1. import * as foo from "foo
  2. import foo = require("foo")
  3. const foo = require("foo")

哪个与 TS 和 ES 模块规范最向前兼容?

也就是说,when/if“foo”库切换到使用 ES 模块,以上哪个最不可能损坏或变得奇怪?

update: (1) looks best since it's real ES Module syntax, but I am concerned about preserving the intended semantics of the CommonJS module we're importing. For example, if a side effect is expected to run when the module is imported, we'd want to preserve that semantics when using import * as syntax.

Another update: We're targeting ES modules. A separate tool does the ES Module -> transformation.

const foo = require("foo")

这个是最差的一个,foo会被打成任何一个,我会不惜一切代价避免它

import foo = require("foo")

这是 typescript 特定的导入语法,同样应尽可能避免。在运行时它被编译为 var foo = require("foo"),但在编译时它提供类型安全。这是导入使用导出分配的模块的唯一方法。

import * as foo from "foo"

这是官方的 ES2015 语法,应尽可能使用(导出赋值情况除外,我认为它可以用于所有其他情况)。

如果编译为 commonjs,上述语法在运行时仍会被转译为 const foo = require("./foo");,因此它的行为应该相同。

有一个警告,打字稿不会发出未使用的导入和仅用于其类型的导入(阅读here)所以如果你想导入一个模块来产生副作用,你可以使用此语法:

import "foo"