在TypeScript中使用本地动态ES2020模块(不含Node.js)并键入东西



我有一个使用es16模块的TypeScript应用,它们中的大多数都是静态导入的。我想使用一个(验证器-)模块,现在只在调试模式下导入。这一切都在工作,但我不知道如何输入东西,以便我得到代码完成和错误检查。

在我的主类main。s我有:

...
if(debug){
import('./validator.js').then((module) => this.validate(module))
}
...

validate方法是这样的:

private validate(module):void{
new module.Validator(dataToValidate);
}

validator.js包含:

export class Validator{
coonstructor(data:MyDatatype){
stuff going on here...
}
}

我想知道/做的是:

validate

方法中的:

private validate(module:someMeaningfulType){...}

,我还想导入Validator类,而不是实际导入它。如果我写

import {Validator} from './validate.ts' 

main的顶部。我将加载文件,无论我需要它,这破坏了动态导入的全部意义。

我可能会尝试在main中为模块验证器编写类型声明。但是,即使这不会以某种方式冲突,我也必须手动将其与实际模块保持同步,这显然不是我想要的。

我可能错过了一些明显的东西,但我不能找出是什么。我发现很难在Typescrit中搜索原生es2020/2022模块的(纯)使用,因为有太多关于节点模块等的信息掩盖了它。

您实际上可以使用importtypeof来获取导入模块的类型:

private validate(module: typeof import("./validator.js")) { ... }

或者,您可以使用仅类型导入,它将在输出中被删除:

import type * as ValidatorModule from "./validator.js";
// ...
private validate(module: ValidatorModule) { ... }

最新更新