TypeScript中如何将导入的模块对象作为类型定义使用
解决方案
错误原因
- 第一个问题是
clients/index.ts导出名称不匹配:导入的是大写开头的Client1/Client2类,导出写的是小写的client1/client2,属于基础语法错误,需要先修正。 - 第二个问题是类型定义写法错误:
import * as clients得到的是运行时可用的模块值对象,类型层面不能直接把clients[key]作为类型使用,需要先通过typeof clients拿到模块对象的类型,再用InstanceType工具类提取构造函数对应的实例类型。
具体实现代码
第一步:修正clients/index.ts
import Client1 from './client1'; import Client2 from './client2'; // 导出名称和导入名称匹配 export { Client1, Client2 };
如果需要实例集合的key为小写,可以在导出时重命名:
export { Client1 as client1, Client2 as client2 };
第二步:调整myApp.ts类型定义
import * as clients from './clients'; // 提取每个导出构造器的实例类型,完成约束 type Clients = { [Key in keyof typeof clients]: InstanceType<typeof clients[Key]> } const allClients: Clients = { Client1: new clients.Client1(), Client2: new clients.Client2(), // 如果导出时用了小写命名,这里key也对应改成小写即可 }
内容的提问来源于stack exchange,提问作者Kousha
相关产品推荐
相关产品推荐

