// 定义只读属性的接口
interface ReadOnlyProps {
readonly readOnlyValue: string;
}
// 定义嵌套对象的接口
interface NestedObject extends ReadOnlyProps {
nested: NestedObject | null;
}
// 创建不可变数据结构的工厂函数
function createImmutableObject(readOnlyValue: string, nested: NestedObject | null): NestedObject {
return Object.freeze({
readOnlyValue,
nested
});
}
// 示例使用
const nestedObj = createImmutableObject('initial value', null);
const outerObj = createImmutableObject('outer value', nestedObj);
// 尝试修改只读属性会报错,在严格模式下,TypeScript会阻止这样的操作
// outerObj.readOnlyValue = 'new value';
// 对嵌套对象操作时保持不可变性
function updateNestedObject(obj: NestedObject, newNested: NestedObject | null): NestedObject {
return createImmutableObject(obj.readOnlyValue, newNested);
}
const newNested = createImmutableObject('new nested value', null);
const updatedObj = updateNestedObject(outerObj, newNested);
确保不可变性的方法
- 使用
readonly
关键字:在TypeScript接口中,使用readonly
关键字标记属性为只读,这样在类型层面就限制了对这些属性的赋值操作。在严格模式下,TypeScript编译器会阻止对这些属性的直接修改。
Object.freeze
:通过Object.freeze
方法冻结对象,使其属性值不能被更改,也不能添加新属性或删除现有属性。这确保了对象本身的不可变性。
- 操作嵌套对象:当需要对嵌套对象进行操作时,不直接修改原有的嵌套对象,而是创建一个新的不可变对象,将原对象的只读属性复制过来,并更新嵌套部分。这样可以保持整个数据结构的不可变性。