从 TypeScript 导入 CommonJS 的最向前兼容的方式是什么?
What is the most forwards-compatible way of importing CommonJS from TypeScript?
从 TypeScript 导入 CommonJS 模块的这三种方式中:
import * as foo from "foo
import foo = require("foo")
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"
从 TypeScript 导入 CommonJS 模块的这三种方式中:
import * as foo from "foo
import foo = require("foo")
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"