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
相关产品推荐
相关产品推荐

