在TypeScript中导入时运行工厂函数?

在TypeScript中导入时运行工厂函数?,typescript,Typescript,在节点中,在导入时运行函数是一种常见的模式,例如,require(“debug”)(“debug:namespace”)。有没有办法在TS中做到这一点?还是有优雅的替代品 在debug示例中,我像这样导入包:import*作为“debug”中的debugInitializer,然后声明const debug=debugInitializer(“debug:namespace”),但这相当冗长。有没有一种更优雅的TypeScript方法或一种模拟上述模式的方法?有严格的语法,可以对其进行静态分析,

在节点中,在导入时运行函数是一种常见的模式,例如,
require(“debug”)(“debug:namespace”)
。有没有办法在TS中做到这一点?还是有优雅的替代品

debug
示例中,我像这样导入包:
import*作为“debug”
中的debugInitializer,然后声明
const debug=debugInitializer(“debug:namespace”)
,但这相当冗长。有没有一种更优雅的TypeScript方法或一种模拟上述模式的方法?

有严格的语法,可以对其进行静态分析,它不能包含表达式

由于
debug
是导出函数而不是对象的CommonJS模块,因此在导入时需要进行特殊处理

正如问题中的代码片段所示,在TypeScript 2.x中调用CommonJS导出的既定方法是:

import * as debugFactory from "debug";
const debug = debugFactory("debug:namespace");
它是可读且类型安全的原始
require
调用的替代品,通常不会导致问题;ES模块可能从导入中获得其他好处,但树震动不适用于此处

另一种与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");
上述方法不允许使用一个将导入视为表达式并将其与函数调用链接的行程序。

可以包含表达式,但由于它们是基于承诺的,这将是:

// inside async function
const debug = (await import("debug"))("debug:namespace");

除非您显示的导入以无效方式使用。唯一有效的原因是,当其他人使用源代码并以不同的模块格式为目标时,这种松散的传输既不能保证继续进行,也不能维护。请解决这个问题,我知道如果您将
import*编写为debugFactory
,您会更清楚,调用
debugFactory
@AluanHaddad是绝对无效的。这是TS中处理CJS模块的方式(在Babel中可能不同,CJS导出可以使用
默认值填充)。答案一般不涉及ES模块(问题也不涉及),其中*不能是函数。该案例非常具体,
debug
是常用的NPM CJS包(主要是节点),其导出是一项功能。如果*不是函数,
require(“debug”)(…)
也不会工作,对吗?如果你有合法的信息适用于当前的情况,并与答案相矛盾,请考虑提供它。不,首先,你的信息过时了,因为TypeScript现在支持默认的导入互操作。其次,require会起作用,对于常见的JS AMD或UMD来说,它是正确的语法,因为它不是问题的焦点,让读者决定什么对他们有利是公平的。