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

如何为带类型注解的const对象提取值类型并保留键约束?

问题:保留类型约束的同时提取对象值的联合类型

我定义了如下联合类型与对象:

type FilterType = 'equals' | 'notEquals';

const labelMap: {[filterType in FilterType]: string} = {
    equals: 'Equals',
    notEquals: 'Not Equals',
} as const;

希望导出等效于以下的类型:

type Labels = 'Equals' | 'Not Equals';

尝试用type Labels = labelMap[keyof labelMap];写法时,只有移除{[filterType in FilterType]: string}类型注解才生效。但我想保留这个注解,确保新增过滤器类型时必须添加对应标签,同时又能提取值的具体字面量类型,且不想单独定义值类型导致多处修改。


解决方案

方法1:使用satisfies关键字(TS 4.9+ 推荐)

TypeScript 4.9引入的satisfies可以完美解决这个问题:它会检查对象是否符合指定类型,但不会拓宽对象的原有类型,as const带来的具体字面量类型会被完整保留。

type FilterType = 'equals' | 'notEquals';

const labelMap = {
    equals: 'Equals',
    notEquals: 'Not Equals',
} as const satisfies {[filterType in FilterType]: string};

// 此时Labels的类型就是 'Equals' | 'Not Equals'
type Labels = typeof labelMap[keyof typeof labelMap];

新增FilterType的成员时,TS会直接报错提示你补充labelMap对应的键值对,既保证了类型约束,又无需额外维护值类型。

方法2:双重类型断言(兼容低版本TS)

如果项目还不能升级到TS 4.9,可以用双重断言:先通过as const让TS推断出具体的字面量类型,再断言它符合目标约束类型。

type FilterType = 'equals' | 'notEquals';

const labelMap = {
    equals: 'Equals',
    notEquals: 'Not Equals',
} as const as {[filterType in FilterType]: string};

type Labels = typeof labelMap[keyof typeof labelMap];

这种写法同样能同时满足类型约束和保留具体值类型的需求。


内容的提问来源于stack exchange,提问作者Carcigenicate

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 16:57:10