如何在TypeScript中访问嵌套对象值并实现强类型参数
解决TypeScript嵌套对象键的强类型约束问题
你当前的Section类型太宽泛,全是字符串索引,导致TypeScript无法识别first/second或者valueA/valueB这类具体键。要给第二个参数加上强类型约束,按下面的方法来:
步骤1:保留数据的具体类型
别给data指定宽泛的Section类型,让TypeScript自动推导它的结构,这样才能捕获到每个section对应的子键:
// 去掉类型标注,让TS自动推导具体结构 const data = { first: { valueA: "1234", valueB: "5678" }, second: { valueA: "0000", valueB: "4444" } }
如果一定要加类型约束,可以用const断言或者定义更精确的接口,但自动推导是最简便的方式。
步骤2:用泛型函数关联参数类型
写一个泛型函数,让第一个参数的键类型直接决定第二个参数的可选范围:
const getSection = <T extends keyof typeof data>(sectionKey: T, itemKey: keyof typeof data[T]) => { return data[sectionKey][itemKey]; }
这样调用时:
- 第一个参数只能选
first或second - 选完第一个参数后,第二个参数只能选对应section里的键(比如选
first,第二个参数只能是valueA/valueB)
额外:若必须保留原Section类型
要是你一定要用Section类型约束data,可以把它改成结合具体键的精确类型:
// 定义具体的键类型 type SectionKeys = 'first' | 'second'; type ItemKeys = 'valueA' | 'valueB'; type Section = Record<SectionKeys, Record<ItemKeys, string>>; const data: Section = { first: { valueA: "1234", valueB: "5678" }, second: { valueA: "0000", valueB: "4444" } } // 泛型函数同样适用 const getSection = <T extends SectionKeys>(sectionKey: T, itemKey: ItemKeys) => { return data[sectionKey][itemKey]; }
这样就能实现完全的强类型约束,输入错误的键会直接在TypeScript中报错。
内容的提问来源于stack exchange,提问作者jill23
相关产品推荐
相关产品推荐

