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

TypeScript中如何导入并使用任意键访问JSON数据?

解决TypeScript中用变量键访问导入JSON的问题

方案1:类型断言为索引签名类型

TypeScript会自动为导入的JSON生成精确的字面量类型,导致只有明确的键(比如示例中的"a")能用来索引。你可以通过类型断言,将导入的JSON转为带有索引签名的类型,比如Record<string, 你的值类型>:

// 先转为unknown再断言,避免类型兼容问题
import t from "./test.json" as unknown as Record<string, { b: string }>;

let k = "a";
console.log(t[k]); // 不再报错

如果值的结构不固定,也可以用更宽泛的类型,比如Record<string, unknown>,之后再结合运行时验证处理具体值。

方案2:结合运行时验证与类型守卫

因为你需要在运行时验证数据,推荐写一个类型守卫函数,既验证JSON结构的合法性,又让TypeScript认可变量键的索引操作:

import t from "./test.json";

// 定义数据的预期类型
type DeviceData = Record<string, { b: string }>;

// 类型守卫函数,运行时验证结构
function isDeviceData(data: unknown): data is DeviceData {
  if (typeof data !== "object" || data === null) return false;
  return Object.values(data).every(item => 
    typeof item === "object" && item !== null && "b" in item && typeof (item as any).b === "string"
  );
}

// 验证后再使用
if (isDeviceData(t)) {
  let k = "a";
  console.log(t[k]); // 类型安全,无报错
} else {
  console.error("JSON数据不符合预期结构");
}

这种方式既满足了运行时验证的要求,又让TypeScript在验证通过后正确推断类型,支持变量键访问。

方案3:约束变量键的类型(仅适用于键已知的场景)

如果变量k的取值范围是JSON中已存在的键,可以用keyof typeof t约束k的类型,这样TypeScript会认可索引操作:

import t from "./test.json";

let k: keyof typeof t = "a"; // 限制k只能是t的键之一
console.log(t[k]); // 正常运行

不过这个方案只适用于键的集合是确定的情况,如果你需要支持任意未知键,前两种方案更合适。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 07:43:18