TypeScript如何将函数返回类型声明为字面量数组参数对应字面量对象?
TypeScript 实现键值一一对应的返回类型
现有代码:
interface inter<A extends string, B extends string> { a: A b: B } function ato<A extends string, B extends string>(...p: Array<inter<A, B>>): {[K in A]: B} { return {} as {[K in A]: B} } const result = ato({ a: 'a0', b: 'b0' }, { a: 'a1', b: 'b1' })
当前result类型为:
{ a0: "b0" | "b1" a1: "b0" | "b1" }
需求是让返回类型变为键值一一对应:
{ a0: 'b0' a1: 'b1' }
可行。原函数的泛型A和B会捕获所有参数中a和b的联合类型,导致每个键对应所有b值的联合。要实现键值一一映射,需要让泛型保留每个参数的具体键值对关系,再通过映射类型构建返回类型。
修改后的代码:
interface inter<A extends string, B extends string> { a: A b: B } function ato<T extends inter<string, string>[]>(...p: T): { [K in T[number]['a']]: Extract<T[number], { a: K }>['b'] } { const res = {} as ReturnType<typeof ato<T>>; p.forEach(item => { res[item.a as keyof typeof res] = item.b; }); return res; } const result = ato( { a: 'a0', b: 'b0' }, { a: 'a1', b: 'b1' } ); // result 类型为 { a0: "b0"; a1: "b1" }
关键说明:
- 泛型
T直接捕获传入参数数组的完整类型,每个元素保留自身a与b的对应关系。 T[number]['a']提取所有参数中a属性的联合类型,作为返回对象的键集合。Extract<T[number], { a: K }>从数组元素类型中筛选出a等于当前键K的类型,再通过['b']获取该类型对应的b值,实现键与值的精准映射。
内容的提问来源于stack exchange,提问作者powerfulH
相关产品推荐
相关产品推荐

