如何获取动态导入类实例的TypeScript类型并导出?
捕获DiffPatcher实例类型并导出到模块级
要获取jsondiffpatch中DiffPatcher的实例类型并将其作为模块级实体导出,你可以结合TypeScript的InstanceType工具类型来实现:
步骤1:定义并导出实例类型
// 先获取DiffPatcher类的构造函数类型 type DiffPatcherConstructor = typeof import('jsondiffpatch')["DiffPatcher"]; // 用InstanceType提取构造函数对应的实例类型并导出 export type DiffPatcherInstance = InstanceType<DiffPatcherConstructor>;
你之前的写法type Foo = typeof import('jsondiffpatch')["DiffPatcher"]得到的是类本身的构造函数类型,而非实例类型。InstanceType<T>是TypeScript专门提供的工具类型,用于从构造函数类型T中提取对应的实例类型,正好解决你的问题。
步骤2:在代码中使用导出的类型
你可以在动态导入的函数中返回实例,并使用导出的类型进行标注,也能在模块级变量中直接使用该类型:
// 承接上面的类型定义 type DiffPatcherConstructor = typeof import('jsondiffpatch')["DiffPatcher"]; export type DiffPatcherInstance = InstanceType<DiffPatcherConstructor>; // 创建实例的函数,返回值标注为导出的实例类型 async function createDiffPatcher(): Promise<DiffPatcherInstance> { const jsondiffpatch = await import('jsondiffpatch'); return new jsondiffpatch.DiffPatcher(); } // 模块级变量使用该类型 let globalDiffPatcher: DiffPatcherInstance; (async () => { globalDiffPatcher = await createDiffPatcher(); // 此时globalDiffPatcher会拥有DiffPatcher实例的完整类型提示 })();
如果jsondiffpatch库本身提供了官方的实例类型导出(比如部分库会额外导出DiffPatcherInstance这类类型),你也可以直接引用库自带的类型,但如果没有的话,上面的方法是通用且可靠的。
内容的提问来源于stack exchange,提问作者Michal Kurz
相关产品推荐
相关产品推荐

