如何使用变量键名获取TypeScript自定义类型的元素?
解决TypeScript中使用变量键访问自定义类型属性的报错问题
问题原因
TypeScript报错是因为你用来访问属性的变量被推断为string类型,而CustomType的键是特定的字符串字面量(比如"optionA"、"optionB"),TS无法确认这个string类型的变量是否对应CustomType的有效属性,因此抛出隐式any的错误。而直接用固定字符串或点语法时,TS能明确识别是有效键,所以不会报错。
解决方案
方案1:自动提取布尔属性的键类型(推荐,适合大量布尔属性场景)
先通过条件类型过滤出CustomType中所有布尔类型属性的键,再用这个类型约束你的键数组:
export type CustomType = { id: number; name: string; optionA: boolean; optionB: boolean; // 其他数十个布尔类型选项... }; // 提取类型中所有布尔属性的键 type BooleanKeys<T> = { [K in keyof T]: T[K] extends boolean ? K : never; }[keyof T]; // 用提取出的类型约束键数组 const possibleKeys: BooleanKeys<CustomType>[] = ["optionA", "optionB"]; const customObject: CustomType = callApi(); for (const keyName of possibleKeys) { // 此时TS能正确推断keyName是CustomType的有效布尔属性键,不会报错 if (customObject[keyName]) { // 执行操作 } }
方案2:手动声明键的联合类型(适合少量属性场景)
如果布尔属性数量不多,可以直接手动声明键的联合类型:
export type CustomType = { id: number; name: string; optionA: boolean; optionB: boolean; }; // 声明允许的键类型 type PossibleKeys = "optionA" | "optionB"; const possibleKeys: PossibleKeys[] = ["optionA", "optionB"]; const customObject: CustomType = callApi(); for (const keyName of possibleKeys) { if (customObject[keyName]) { // 执行操作 } }
方案3:单个变量的字面量类型断言
如果只是单个变量的场景,可以用as const让TS把变量推断为字符串字面量类型:
const keyName = "optionA" as const; console.log(customObject[keyName]); // 不再报错
为什么不要用索引签名
你尝试的索引签名(比如[key: string]: boolean)会强制CustomType的所有属性都为布尔类型,和你原本的id(number)、name(string)类型冲突,所以会出现大量语法错误,这并不是适合当前场景的解决方案。
内容的提问来源于stack exchange,提问作者Anonica
相关产品推荐
相关产品推荐

