实现 shallowReadonly 功能

在本小节中,我们将会实现 shallowReadonly 功能

1. happy path 测试样例

it('happy path', () => {
    const original = { bar: { foo: 1 } }
    // shallow 的意思是浅的,默认 readonly 是嵌套的,而 shallowReadonly 刚好相反
    const shallow = shallowReadonly(original)
    expect(isReadonly(shallow)).toBe(true)
    expect(isReadonly(shallow.bar)).toBe(false)
})

2. shallowReadonly 的实现

// reactive.ts

// other code ...

export function shallowReadonly(raw) {
  return createActiveObject(raw, shallowReadonlyHandlers)
}
// baseHandlers

// other code ...

const shallowReadonlyGet = createGetter(true, true)

// 参数加上 shallow
function createGetter(isReadonly = false, shallow = false) {
  return function get(target, key, receiver) {
    // other code ...
      
    // 如果是 shallow ,直接 return res 即可
    if (shallow) return res
		
    if (isObject(res)) {
      return isReadonly ? readonly(res) : reactive(res)
    }

    if (!isReadonly) {
      track(target, key)
    }
    return res
  }
}


// 这里我们发现 shalloReadonlyHandlers 和 readonly 的 set 一样
// 就可以复制一份,复写 get 就好了
export const shallowReadonlyHandlers = extend({}, readonlyHandlers, {
  get: shallowReadonlyGet,
})

这样我们再跑测试就可以通过了