如何为TypeScript中类映射对应的实例对象标注类型?
解决动态创建实例映射的类型标注问题
当你通过类映射动态创建实例映射时,直接使用typeof classMap无法得到正确的实例类型,因为typeof classMap返回的是构造函数类型集合,而非实例类型集合。可以通过TypeScript的映射类型和InstanceType工具类型来解决这个问题:
步骤1:推导类映射的类型
先基于已有的classMap获取其类型:
type ClassMapType = typeof classMap;
步骤2:定义实例映射的类型
利用映射类型遍历ClassMapType的所有键,通过InstanceType<>将每个构造函数类型转换为对应的实例类型:
type InstanceMapType = { [Key in keyof ClassMapType]: InstanceType<ClassMapType[Key]>; };
步骤3:为实例映射标注类型
给instanceMap标注InstanceMapType类型即可获得完整的方法自动补全:
// 手动创建实例的场景 const instanceMap: InstanceMapType = { service1: new classMap.service1(), service2: new classMap.service2() }; // 批量创建实例的场景(适合数百个类的情况) const instanceMap: InstanceMapType = Object.fromEntries( Object.entries(classMap).map(([key, Cls]) => [key, new Cls()]) ) as InstanceMapType;
这样处理后,访问instanceMap.service1时就能正确获取Service1类的所有方法和属性的类型提示了。
内容的提问来源于stack exchange,提问作者Sophon Aniketos
相关产品推荐
相关产品推荐

