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

TypeScript中如何从数组提取已用值并转为字面量类型

解决方法

核心问题是你直接给options指定了Param[]类型,这会让TypeScript把数组里每个元素的key类型拓宽为完整的AvailableKeys,而非保留实际的字面量类型。要自动推导实际使用的键,得让TypeScript保留数组元素的窄类型。

方案一:使用as const断言

通过as const让TypeScript将数组元素视为只读字面量类型,就能准确提取实际用到的键:

type AvailableKeys = 'fontSize' | 'skip' | 'something';

interface Param {
    key: AvailableKeys;
}

// 用as const锁定字面量类型
const options = [{
    key: 'fontSize',
}, {
    key: 'skip',
}] as const;

// 提取实际使用的键类型
type UsedKeys = typeof options[number]['key']; // 类型为 'fontSize' | 'skip'

方案二:泛型函数推导类型

如果需要options保持可变性(不需要只读),可以用泛型函数捕获数组的窄类型:

type AvailableKeys = 'fontSize' | 'skip' | 'something';

interface Param<K extends AvailableKeys = AvailableKeys> {
    key: K;
}

// 泛型函数推导数组元素的具体键类型
function createOptions<K extends AvailableKeys>(opts: Param<K>[]) {
    return opts;
}

const options = createOptions([{
    key: 'fontSize',
}, {
    key: 'skip',
}]);

type UsedKeys = typeof options[number]['key']; // 类型为 'fontSize' | 'skip'

原代码失效原因

当你写const options: Param[] = [...]时,TypeScript会把每个元素的key类型推断为AvailableKeys(因为Param的key定义是这个联合类型),所以typeof options[number]['key']自然是完整的AvailableKeys,而非子集。只有让TypeScript保留每个元素的具体字面量类型,才能提取出实际使用的键。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 04:04:59