在导入时运行函数是 Node 中的常见模式,例如require("debug")("debug:namespace")。TS中有没有办法做到这一点?或者有一个优雅的替代品吗?
在debug示例中,我像这样导入包:import * as debugInitalizer from "debug"然后再声明,const debug = debugInitializer("debug:namespace")但这非常冗长。是否有更优雅的 TypeScript 方式或模拟上述模式的方式?
import具有严格的语法,可以对其进行静态分析,它不能包含表达式。
由于debugCommonJS 模块导出的是函数而不是对象,因此在导入时需要特殊处理。
正如问题中的代码片段所示,在 TypeScript 2.x 中调用 CommonJS 导出的既定方法是:
import * as debugFactory from "debug";
const debug = debugFactory("debug:namespace");
Run Code Online (Sandbox Code Playgroud)
它是原始调用的可读且类型安全的替代方案require,通常不会导致问题;ES 模块可能会从 中获得其他好处import,但 Tree Shaking 在这里不适用。
另一种不与 ES 模块规范相矛盾且面向未来的编写方式是 TypeScript 特定import..require语法:
import debugFactory = require("debug");
const debug = debugFactory("debug:namespace");
Run Code Online (Sandbox Code Playgroud)
在 TypeScript 2.7 及更高版本中,可以使用esModuleInterop编译器选项将合成default导出添加到 CommonJS 模块(即debug)并将导入语法更改为:
import debugFactory from "debug";
const debug = debugFactory("debug:namespace");
Run Code Online (Sandbox Code Playgroud)
上述方法不允许将导入视为表达式并将其与函数调用链接起来。
动态导入可以涉及表达式,但由于它们是基于承诺的,因此这将是:
// inside async function
const debug = (await import("debug"))("debug:namespace");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3100 次 |
| 最近记录: |