如何编写实现数组到对象一对一转换的TypeScript泛型类型
正确泛型实现
type Data = readonly (readonly [number, string])[] type TransArrayToObject = <TD extends Data>( data: TD, ) => { // 遍历数组的每一项,将第二项作为键,第一项作为对应值 readonly [Item in TD[number] as Item[1]]: Item[0] } // 配套运行时实现参考 const transArrayToObject = ((data: Data) => { return Object.fromEntries(data.map(([value, key]) => [key, value])) }) as TransArrayToObject
调用你给出的测试用例后,就能得到预期的类型结果:
const result = transArrayToObject([ [1, 'A'], [2, 'B'], ] as const) // result类型为 { readonly A: 1; readonly B: 2 }
原写法错误原因
你之前的写法中,[K in TD[number][1]]会先提取所有子元素的第二项组成联合类型 'A' | 'B' 作为对象键,而每个键对应的值TD[number][0]是所有子元素第一项的联合类型 1 | 2,没有把键和对应子元素的第一项做绑定,因此所有属性的类型都变成了联合类型。
新写法直接遍历数组的每个子元素,通过as Item[1]将当前子元素的第二项映射为对象键,对应的值直接取当前子元素的第一项,自然就实现了一一对应的映射关系。
内容的提问来源于stack exchange,提问作者Simon Wong
相关产品推荐
相关产品推荐

