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

如何实现嵌套对象的泛型类型?求Setting泛型实现方案

首先可以简化你现有的中间类型,因为Group和SettingsGroup其实是冗余的——直接通过Settings[T]就能获取对应分组的类型,不需要额外的映射逻辑。

完整实现方案:

首先给配置对象加上as const,让TypeScript推断出更精确的字面量类型(否则值类型会被拓宽为string/number/boolean,而非具体的字面量):

const settings = {
  groupOne: {
    settingOne: 'string',
    settingTo: 123,
  },
  groupTwo: {
    settingThree: true,
  },
} as const;

然后定义所需的类型:

type Settings = typeof settings;
type GroupKey = keyof Settings;

// 简化后的配置键类型:直接取对应分组的键集合
type SettingKey<T extends GroupKey> = keyof Settings[T];

// 实现你需要的Setting类型:根据分组键和配置键,取对应值的类型
type Setting<T extends GroupKey, K extends SettingKey<T>> = Settings[T][K];

// 函数类型定义(用泛型约束保证参数和返回值的类型关联)
type GetSettingFunction = <T extends GroupKey>(group: T, setting: SettingKey<T>) => Setting<T, typeof setting>;

最后实现函数:

const getSetting: GetSettingFunction = (group, setting) => {
  return settings[group][setting];
};

验证效果:

调用函数时,TypeScript会自动校验参数合法性,并推导正确的返回值类型:

// 合法调用,返回类型为字面量类型'string'
const val1 = getSetting('groupOne', 'settingOne');
// 返回类型为字面量类型123
const val2 = getSetting('groupOne', 'settingTo');
// 返回类型为字面量类型true
const val3 = getSetting('groupTwo', 'settingThree');

// 非法调用会直接报错:
// getSetting('groupOne', 'settingThree'); // 配置键不存在于groupOne
// getSetting('groupThree', 'settingOne'); // 分组不存在

如果你不想单独定义GetSettingFunction,也可以直接用泛型函数的写法,效果完全一致:

const getSetting = <T extends GroupKey>(group: T, setting: SettingKey<T>): Setting<T, typeof setting> => {
  return settings[group][setting];
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 11:15:42