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

如何通过泛型容器根据对象键精准推断属性类型?

如何让泛型容器的键取值方法返回精确类型

要解决这个问题,核心是让getHiddenByKey方法能根据传入的具体键,精确推断出对应属性的类型,而非返回所有属性类型的联合。关键在于把方法本身定义为泛型方法,让参数和返回值的类型绑定到具体的键上。

正确实现方式

type MyType = {
    foo: string;
    baz: number;
}

// 修改容器类型,将getHiddenByKey定义为泛型方法
type MyContainer<T> = {
    hidden: T;
    getHiddenByKey: <K extends keyof T>(key: K) => T[K];
};

function createGenericContainer<T>(hidden: T): MyContainer<T> {
    return { 
        hidden,
        // 方法对应改成泛型
        getHiddenByKey: <K extends keyof T>(key: K) => {
            return hidden[key];
        }
    };
}

const container = createGenericContainer<MyType>({
    foo: "fooooo yeah",
    baz: 22222
});

const containerInferred = container.getHiddenByKey('baz'); // 类型为number,正确!
const containerInferred2 = container.getHiddenByKey('foo'); // 类型为string,正确!

为什么之前的方案无效?

  1. 第一个方案:GetValueByKey<T>定义的函数接受任意keyof T,返回T[keyof T](所有属性类型的联合)。因为函数没有将具体的键和返回值类型绑定,TypeScript无法区分不同键对应的返回类型,只能返回联合类型。

  2. 第二个方案:MyContainerCombo<T>是一个联合类型的容器,每个分支对应单个键的方法签名。但实际返回的对象中,getHiddenByKey仍然接受任意keyof T,不符合联合类型中任何一个分支的方法签名(每个分支的方法只接受单个键)。TypeScript会取联合类型的公共部分来推断,结果还是返回联合类型。

原理说明

将getHiddenByKey定义为泛型方法后,当调用时传入具体的键(比如'baz'),TypeScript会自动将泛型参数K推断为该键的字面量类型('baz'),从而返回精确的T[K]类型(number),实现了键与返回值类型的一一绑定。

你也可以不用显式指定MyType,让TypeScript自动推断传入对象的类型:

const container = createGenericContainer({
    foo: "fooooo yeah",
    baz: 22222
});
// container的类型会被自动推断为MyContainer<{foo: string; baz: number}>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 20:02:30