如何实现嵌套对象的泛型类型?求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
相关产品推荐
相关产品推荐

