题目

不要使用内置的Readonly,自己实现一个。
该 Readonly 会接收一个 泛型参数,并返回一个完全一样的类型,只是所有属性都会被 readonly 所修饰。
也就是不可以再对该对象的属性赋值。

  1. interface Todo {
  2. title: string
  3. description: string
  4. }
  5. const todo: MyReadonly<Todo> = {
  6. title: "Hey",
  7. description: "foobar"
  8. }
  9. todo.title = "Hello" // Error: cannot reassign a readonly property
  10. todo.description = "barFoo" // Error: cannot reassign a readonly property

单元测试

import { Equal, Expect } from '@type-challenges/utils'

type cases = [
  Expect<Equal<MyReadonly<Todo1>, Readonly<Todo1>>>,
]

interface Todo1 {
  title: string
  description: string
  completed: boolean
  meta: {
    author: string
  }
}

通过 JS 解题

function readonly () {
  const result = {};
  for (const key in obj) {
      result['readonly_' + key] = obj[key]; // 通过 key 前缀 readonly_ 模拟只读设置操作
  }
    return result;
}

知识点

  1. 返回一个对象
  2. 遍历 obj(JS 对象,TS 接口)
  3. 加上 readonly 关键字
  4. 通过 key 来获取 obj(接口)里面的值

    翻译为 TS

    type MyReadonly<T> = {
    readonly [P in keyof T] : T[P];
    };
    
  5. 返回一个对象

  6. 遍历 obj(JS 对象,TS 接口)
  • in -> mapped key of -> lookup
  1. 加上 readonly 关键字
  • readonly
  1. 通过 key 来获取 obj(接口)里面的值
  • indexed