这是Node中用于在导入时运行函数的常见模式,例如GroupBy
。有没有办法在TS中做到这一点?还是有优雅的替代品?
在require("debug")("debug:namespace")
示例中,我正在导入包,如下所示:debug
然后声明import * as debugInitalizer from "debug"
,但这非常详细。是否有更优雅的TypeScript方式或模拟上述模式的方法?
答案 0 :(得分:3)
import
具有严格的语法,可以对其进行静态分析,但不能包含表达式。
由于debug
是导出函数而不是对象的CommonJS模块,因此导入时需要特殊处理。
正如问题中的代码段所示,在TypeScript 2.x中调用CommonJS导出的既定方法是:
import * as debugFactory from "debug";
const debug = debugFactory("debug:namespace");
它是原始require
调用的可读且类型安全的替代方法,一般不会导致问题; ES模块可能会从import
获得其他好处,但树摇动不适用于此。
另一种编写此方法的方法与ES模块规范不矛盾且往往具有面向未来的特点是TypeScript特定的import..require
语法:
import debugFactory = require("debug");
const debug = debugFactory("debug:namespace");
在TypeScript 2.7及更高版本中,可以使用esModuleInterop
编译器选项将合成default
导出添加到CommonJS模块(debug
是)并将导入语法更改为:
import debugFactory from "debug";
const debug = debugFactory("debug:namespace");
上述方法不允许使用单行代码将导入视为表达式并使用函数调用将其链接。
Dynamic imports可能涉及表达式,但由于它们是基于承诺的,因此将是:
// inside async function
const debug = (await import("debug"))("debug:namespace");