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

如何推断TypeScript中JSON对象的属性类型?

TypeScript中推断JSON对象属性类型的方法

假设我们有如下JSON文件(faq.json):

{
  "hardened-computer": {
    "metadata": {
      "title": "How to verify integrity of release?"
    },
    "content": "foo"
  },
  "release-integrity": {
    "metadata": {
      "title": "What is a hardened computer?"
    },
    "content": "bar"
  }
}

在TypeScript项目中导入该文件后,需要用URI路径中的topic(比如/faq/[topic])作为属性键获取对应数据,下面介绍两种推断SomeType类型的方法:

方法一:自动推断属性值类型

直接利用TypeScript的类型推导能力,通过typeof faq[keyof typeof faq]获取JSON对象所有属性值的类型:

import faq from "./faq.json"

const getTopic = () => {
  // 模拟从URI提取topic的逻辑,返回实际存在的键值
  return "hardened-computer" as const;
}

const topic = getTopic()

// 自动推断所有topic对应的对象类型
type SomeType = typeof faq[keyof typeof faq]

let topicData: SomeType

topicData = faq[topic as keyof typeof faq]

这种方式无需手动定义接口,后续JSON文件新增或修改结构时,类型会自动同步更新。如果所有topic的结构一致,SomeType会是统一的对象类型;如果结构不同,则会是多个类型的联合类型。

方法二:手动定义统一接口

如果所有FAQ项的结构固定,可以手动定义接口来约束类型:

import faq from "./faq.json"

const getTopic = () => {
  return "hardened-computer" as const;
}

const topic = getTopic()

// 定义单个FAQ项的结构接口
interface FaqItem {
  metadata: {
    title: string;
  };
  content: string;
}

// SomeType直接复用该接口
type SomeType = FaqItem

let topicData: SomeType

topicData = faq[topic as keyof typeof faq]

这种方式类型更清晰,适合需要明确结构约束的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 06:15:44