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
相关产品推荐
相关产品推荐

