能否将TypeScript类型声明为常量以限制对象属性不可修改?
实现只读对象的全局类型约束
当然可以实现这个需求,TypeScript提供了几种直接的方式来约束对象属性不可修改,下面是具体方案:
方法1:使用内置Readonly工具类型
TypeScript内置的Readonly<T>工具类型会自动把类型中所有属性转为只读,直接用它定义你的全局类型即可:
type T = Readonly<{ foo: number }>; // 合法声明 const a: T = { foo: 123 }; // 以下操作都会触发报错,符合你的约束要求 let b: T = { foo: 456 }; b.foo = 789; // 错误:无法分配到 "foo" ,因为它是只读属性 a.foo = 321; // 错误:无法分配到 "foo" ,因为它是只读属性
方法2:手动给属性添加readonly关键字
也可以直接在类型定义里给目标属性加上readonly修饰符,效果和Readonly工具类型完全一致:
type T = { readonly foo: number; }; // 使用方式与上面一致 const a: T = { foo: 123 }; a.foo = 321; // 报错:只读属性不可修改
关于as const的说明
你尝试的type T = {foo: number,} as const;属于语法错误,因为as const是值层面的类型断言,用来把具体值转为字面量类型且强制所有属性只读,不能直接用于类型定义。如果要针对单个值做只读约束,可以这么写:
const a = { foo: 123 } as const; a.foo = 321; // 报错:只读属性不可修改
但这种方式没办法复用全局类型,所以如果要给多个对象统一设置约束,还是推荐前面两种类型层面的方案。
补充:结合const声明强化约束
如果用const声明对象,再配合只读类型,就能同时实现双重约束:
const a: T = { foo: 123 }:a本身不能被重新赋值为其他对象,同时a.foo也不能修改- 如果用
let a: T = { foo: 123 }:a可以被重新赋值为符合T类型的其他对象,但每个对象的foo属性依然无法修改
内容的提问来源于stack exchange,提问作者d.k
相关产品推荐
相关产品推荐

