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

如何创建键只读且动态、值为固定类型的TypeScript对象类型?

解决方案

要实现只能访问对象已存在的属性、无需手动声明键类型、添加新车时自动进行类型检查的需求,可以利用 TypeScript 的类型推导和 satisfies 关键字(TypeScript 4.9+ 支持)来实现,不需要手动维护键的联合类型。

核心思路

  1. 避免直接使用 Record<string, Car>(它允许任意字符串键,无法限制未知属性访问)。
  2. 让 TypeScript 自动推导对象的键类型,同时用 satisfies 确保每个值都符合 Car 接口的要求。
  3. 可选:如果需要让对象的属性(键)只读,再用 Readonly 包裹类型。

具体实现

场景1:仅限制访问已存在的键(允许修改已有车辆的属性)

interface Car {
  model: string;
  year: number;
}

// 定义对象时,用satisfies确保每个值符合Car类型,TypeScript会自动推导键的具体类型
const carLot = {
  oldCar: {
    model: "acura",
    year: 1998,
  },
  otherCar: {
    model: "Mitsubishi",
    year: 1995,
  }
} satisfies Record<string, Car>;

// 此时访问不存在的键会报错:Property 'nonexistentCar' does not exist on type...
// 添加新车时,TypeScript会自动更新carLot的类型,同时检查新车是否符合Car接口

场景2:限制访问已存在的键,且所有属性(包括车辆的model/year)只读

如果需要让整个对象完全只读(无法修改任何属性,也无法添加新键),可以结合 as const 和 satisfies:

interface Car {
  model: string;
  year: number;
}

const carLot = {
  oldCar: {
    model: "acura",
    year: 1998,
  },
  otherCar: {
    model: "Mitsubishi",
    year: 1995,
  }
} as const satisfies Record<string, Readonly<Car>>;

// 此时不仅访问未知键会报错,修改已有属性也会报错:Cannot assign to 'model' because it is a read-only property...

为什么这个方案可行

  • satisfies 关键字既能确保对象符合指定类型(这里是 Record<string, Car>),又不会覆盖 TypeScript 自动推导的具体键类型,完美解决了“无需手动声明键”和“类型检查”的双重需求。
  • 当你添加新车时,TypeScript 会自动更新 carLot 的类型,无需手动修改任何类型定义,维护成本极低。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 18:55:32