You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将导出多类型的命名空间转为这些类型的联合类型?

问题描述

我有一个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 01:54:57