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

如何使用变量键名获取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 22:18:26