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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 10:52:44