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

如何提取Typescript导入的JSON模块嵌套字段的字面量联合类型

问题原因

你遇到的不是TypeScript对JSON模块仅支持一层类型推断的限制,而是默认配置下,通过resolveJsonModule导入的JSON内容会被自动类型拓宽:所有字符串字段会被推断为string基础类型,不会保留原始的字面量值类型,和嵌套层级没有关系。

解决方案

这里提供两种可直接落地的实现方案:

方案1:导入时添加const断言(TS 4.9及以上版本推荐)

借助ES模块导入断言+TypeScript的const断言,直接让编译器完整保留JSON所有层级的字面量类型,无需修改原JSON文件:

// 导入时添加as const即可
import lookup from './data.json' assert { type: 'json' } as const;

type LookupType = typeof lookup;
// 现在可以直接提取到嵌套字段的字面量联合
type MarketIds = LookupType[keyof LookupType]['market_id'];
// 类型为 "111172" | "526970" | "3240" | "4" | ...

方案2:将JSON转为TS常量文件(兼容所有TS 3.4及以上版本)

如果你的项目TS版本较低,不支持导入时加const断言,可以把data.json重命名为data.ts,导出时加上as const断言:

// data.ts
export default {
  "au": {
    "name": "Australia",
    "market_id": "111172",
    "language_code": "en_AU"
  },
  "br": {
    "name": "Brazil",
    "market_id": "526970",
    "language_code": "pt_BR"
  },
  "ch": {
    "name": "China",
    "market_id": "3240",
    "language_code": "zh_CN"
  },
  "de": {
    "name": "Germany",
    "market_id": "4",
    "language_code": "de_DE"
  },
  // 剩余内容保持不变
} as const

导入后使用逻辑和之前完全一致:

import lookup from './data'

type LookupType = typeof lookup;
type MarketIds = LookupType[keyof LookupType]['market_id'];
// 同样能得到正确的字面量联合类型

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 23:06:05