TypeScript动态访问生成文件类型遇TS2709错误
解决TypeScript模块命名空间无法索引访问类型的问题
问题原因
当你通过import type * as GeneratedTypes from './generated.ts'导入模块时,GeneratedTypes是模块命名空间,而非TypeScript支持索引操作的对象类型,因此无法使用GeneratedTypes['TypeName']这种动态索引语法,会抛出Cannot use namespace 'GeneratedTypes' as a type错误。
解决方案
方案1:直接使用模块类型引用
利用TypeScript的import()类型语法,直接获取整个模块的类型映射,它支持索引访问:
// 定义模块类型映射 type GeneratedTypeMap = import('./generated.ts'); // 你的动态计算类型 type ComputedNameFromOtherStrings = Compute<QueryName>; // 现在可以安全地动态访问类型 type Variables = GeneratedTypeMap[ComputedNameFromOtherStrings];
方案2:将已导入的命名空间转换为可索引类型
如果已经导入了模块命名空间,可通过映射类型将其转换为支持索引的对象类型:
import type * as GeneratedTypes from './generated.ts'; // 把模块命名空间转换为可索引的类型映射 type GeneratedTypeMap = { [K in keyof typeof GeneratedTypes]: typeof GeneratedTypes[K] }; type ComputedNameFromOtherStrings = Compute<QueryName>; type Variables = GeneratedTypeMap[ComputedNameFromOtherStrings];
补充说明
静态访问GeneratedTypes.GetCompanyForEmployeeQueryVariables之所以可行,是因为TypeScript允许直接访问模块命名空间的导出成员,但这种方式不支持动态索引;而上述两种方案都是将模块转换为标准的对象类型结构,从而支持动态索引操作。
内容的提问来源于stack exchange,提问作者Vashnak
相关产品推荐
相关产品推荐

