MST

星途 面试题库

面试题:TypeScript只读属性在复杂不可变数据结构的设计与实践

假设你要设计一个复杂的不可变数据结构,例如一个多层嵌套的对象,其中某些属性是只读的。请用TypeScript代码实现,并说明如何确保整个数据结构的不可变性,包括在对嵌套对象进行操作时如何保持只读属性的特性。
48.4万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
// 定义只读属性的接口
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);

确保不可变性的方法

  1. 使用readonly关键字:在TypeScript接口中,使用readonly关键字标记属性为只读,这样在类型层面就限制了对这些属性的赋值操作。在严格模式下,TypeScript编译器会阻止对这些属性的直接修改。
  2. Object.freeze:通过Object.freeze方法冻结对象,使其属性值不能被更改,也不能添加新属性或删除现有属性。这确保了对象本身的不可变性。
  3. 操作嵌套对象:当需要对嵌套对象进行操作时,不直接修改原有的嵌套对象,而是创建一个新的不可变对象,将原对象的只读属性复制过来,并更新嵌套部分。这样可以保持整个数据结构的不可变性。