如何用两个TypeScript联合类型生成指定结构的索引签名类型
实现方案
要实现按联合类型顺序一一映射为键值对应的对象类型,需要先借助工具类型把联合类型按稳定顺序转为元组,再按索引匹配键值:
完整代码实现
// 联合类型转有序元组工具类型(TS4.0+支持字面量联合顺序稳定) type UnionToTuple<T, U = T> = [T] extends [never] ? [] : T extends any ? [T, ...UnionToTuple<Exclude<U, T>>] : never // 目标泛型类型A的实现 type A<K extends PropertyKey, V> = { [Index in keyof UnionToTuple<K> as UnionToTuple<K>[Index]]: UnionToTuple<V>[Index] }
效果测试
代入你给出的类型验证:
type key = "a" | "b" | "c" type value = 1 | 2 | 3 // 最终生成的Result类型等价于 {a:1, b:2, c:3} type Result = A<key, value>
注意事项
该实现仅适用于两个联合类型长度相等的场景,依赖TypeScript同类型字面量联合的排序稳定特性,如果联合长度不一致,超出长度的键对应的值会为
undefined类型。
内容的提问来源于stack exchange,提问作者Acid Coder
相关产品推荐
相关产品推荐

