如何将导出多类型的命名空间转为这些类型的联合类型?
问题描述
我有一个index.ts文件,导出内容如下:
// [...] export { UsalonData, TalonData, UsageData, GateSaclayData, EcsData, EffacementData, SplineData, RegressionData, CompdivData, ClusteringData, ClassificationData };
在另一个文件中,我将这些类型作为泛型类型使用:
// [...] export default interface Study< T = UsalonData | TalonData | UsageData | GateSaclayData // | ..... > { // ... }
我希望通过Utility Types创建联合类型,而非逐个复制类型。尝试了以下代码:
import * as allStudiesTypes from '../algos-types'; type Values<T> = T[keyof T]; type AllDataUnion = Values<typeof allStudiesTypes>;
但最终AllDataUnion解析为type AllDataUnion = never,请问该如何解决?
解决方案
出现never的核心原因是:用import * as allStudiesTypes导入时,typeof allStudiesTypes得到的是模块命名空间对象,TypeScript中这个对象仅记录值级别的导出,而你导出的都是类型、没有对应的值,所以keyof typeof allStudiesTypes会返回never,最终Values类型也就变成never了。
提供两种可行解决办法:
方法一:在原导出文件创建显式联合类型
直接在index.ts中定义并导出所有类型的联合类型,后续直接导入使用即可:
// index.ts export { UsalonData, TalonData, UsageData, GateSaclayData, EcsData, EffacementData, SplineData, RegressionData, CompdivData, ClusteringData, ClassificationData }; // 定义并导出联合类型 export type AllDataUnion = UsalonData | TalonData | UsageData | GateSaclayData | EcsData | EffacementData | SplineData | RegressionData | CompdivData | ClusteringData | ClassificationData;
使用文件中直接导入该联合类型:
import { AllDataUnion } from '../algos-types'; export default interface Study< T = AllDataUnion > { // ... }
方法二:用import type配合类型查询(TS 4.5+)
如果不想修改原导出文件,可使用TypeScript 4.5及以上版本支持的import type *语法,仅导入类型信息,再通过类型查询获取联合类型:
import type * as allStudiesTypes from '../algos-types'; type AllDataUnion = allStudiesTypes[keyof typeof allStudiesTypes];
这种方式下,import type确保仅处理类型导出,keyof typeof allStudiesTypes能正确获取所有导出的类型名称,最终生成目标联合类型。
内容的提问来源于stack exchange,提问作者Zorzi
相关产品推荐
相关产品推荐

