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

能否从元组所有成员推断泛型?同时满足双重类型约束

解决方案:同时约束p参数类型与key3的合法性

可以实现这个需求,核心思路是让泛型绑定数组中每个元素的独立类型,而非统一用全局泛型约束,这样既可以提取所有key2类型的联合,又能保证每个元素的key3是对应key1的键。

实现代码

function get<T extends readonly {
    key1: K;
    key2: V;
    key3: keyof K;
}[]>(t: T, p: T[number]["key2"]) {
    return t;
}

验证测试用例

测试1:p参数支持所有key2类型的联合

get(
    [
        {
            key1: { key: "" },
            key2: "",
            key3: "key" // 合法,"key"是当前元素key1的键
        },
        {
            key1: { id: 0 },
            key2: 0,
            key3: "id" // 合法,"id"是当前元素key1的键
        }
    ] as const,
    "" // 合法,string是key2的类型之一
);

get(
    [/* 同上数组 */] as const,
    0 // 合法,number是key2的类型之一
);

测试2:key3不合法时会触发类型报错

get(
    [
        {
            key1: { key: "" },
            key2: "",
            key3: "invalidKey" // ❌ 报错:"invalidKey"不是当前元素key1的键
        }
    ] as const,
    ""
);

原理说明

  • 泛型T被约束为数组,数组内每个元素的结构强制要求:key3必须是对应key1的键(keyof K),从根源保证了key3的合法性。
  • T[number]["key2"]会自动提取数组所有元素key2类型的联合,完美实现了p参数的类型约束。

内容的提问来源于stack exchange,提问作者erce312

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 11:25:02