如何在TypeScript中使用条件导入模块暴露的类型?
问题原因
TS静态编译阶段无法识别未引入的foo类型,所以抛出找不到名称的报错,你可以通过纯类型层面的操作获取类型定义,完全不需要静态导入模块的运行时代码,两种可行方案如下:
方案1:使用import type仅导入类型
import type是TypeScript专属的类型导入语法,编译后会被完全擦除,不会生成任何实际的JS导入代码,不会影响运行时的条件导入逻辑:
import os from 'os'; // 仅导入类型,编译后无任何残留代码 import type { foo } from 'platform-dependent-module'; export default async function doSomething(): Promise<foo | null> { if(os.type() === 'some os') { // "platform-dependent-module" exposes type "foo" const module = await import("platform-dependent-module"); // do stuff return bar; // bar is of type foo } return null; }
方案2:通过类型运算推导,完全不写导入语句
如果连import type声明都不想加,可以直接通过typeof import()的类型运算从模块中提取类型,该运算仅在编译阶段执行,不会产生实际的导入行为:
import os from 'os'; // 从动态导入的返回类型中提取foo定义,TS 4.5+支持Awaited工具类型 type Foo = Awaited<typeof import("platform-dependent-module")>['foo']; export default async function doSomething(): Promise<Foo | null> { if(os.type() === 'some os') { const module = await import("platform-dependent-module"); // do stuff return bar; // bar is of type Foo } return null; }
内容的提问来源于stack exchange,提问作者Kerim Güney
相关产品推荐
相关产品推荐

