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

TypeScript中将数组转换为只读关联数组的实现方法咨询

如何在TypeScript中将只读数组转换为只读关联数组

方案1:通过reduce构建并标注只读字典类型

你可以用Array.reduce()遍历原数组构建字典,再通过Readonly<Record<string, Greeting>>类型确保整个对象只读:

interface Greeting {
    name: string,
    punctuation?: string,
}

const GreetingArray: ReadonlyArray<Greeting> = [
    {name: "noob", punctuation: "!"},
    {name: "sam", punctuation: "."}
]

const GreetingDict: Readonly<Record<string, Greeting>> = GreetingArray.reduce((acc, item) => {
    acc[item.name] = item;
    return acc;
}, {} as Record<string, Greeting>);
  • Record<string, Greeting>定义了字典的结构:字符串键对应Greeting类型的值
  • Readonly<>包裹后,整个对象的键值对都无法被修改(比如不能执行GreetingDict.noob = {...}这类操作)

方案2:用as const实现更精确的只读推断

如果原数组的元素是字面量值,可以给数组加上as const,让TypeScript自动推断出包含只读属性的精确字典类型:

interface Greeting {
    name: string,
    punctuation?: string,
}

// 标记数组为只读字面量类型
const GreetingArray = [
    {name: "noob", punctuation: "!"},
    {name: "sam", punctuation: "."}
] as const;

const GreetingDict = GreetingArray.reduce((acc, item) => {
    acc[item.name] = item;
    return acc;
}, {} as const);

此时GreetingDict的类型会被推断为Readonly<{ noob: { readonly name: "noob"; readonly punctuation: "!"; }; sam: { readonly name: "sam"; readonly punctuation: "."; }; }>,不仅对象本身只读,内部的每个属性也都是只读的。

用ReadonlyMap实现只读映射

如果你倾向于用Map而不是普通对象,TypeScript提供了ReadonlyMap类型来禁止修改操作:

const GreetingMap: ReadonlyMap<string, Greeting> = new Map(
    GreetingArray.map(item => [item.name, item])
);

ReadonlyMap会限制你只能调用get()等读取方法,无法使用set()、delete()来修改映射内容。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 08:23:28