type-challenges:Readonly

48 阅读1分钟

Readonly

问题描述

不要使用内置的Readonly<T>,自己实现一个。

泛型 Readonly<T> 会接收一个 泛型参数,并返回一个完全一样的类型,只是所有属性都会是只读 (readonly) 的。

也就是不可以再对该对象的属性赋值。

例如:

interface Todo {
  title: string
  description: string
}
​
const todo: MyReadonly<Todo> = {
  title: "Hey",
  description: "foobar"
}
​
todo.title = "Hello" // Error: cannot reassign a readonly property
todo.description = "barFoo" // Error: cannot reassign a readonly property
// ============= Test Cases =============
import type { Equal, Expect } from './test-utils'type cases = [Expect<Equal<MyReadonly<Todo1>, Readonly<Todo1>>>]
​
interface Todo1 {
  title: string
  description: string
  completed: boolean
  meta: {
    author: string
  }
}
​
// ============= Your Code Here =============
// 答案
type MyReadonly<T> = {
  readonly [P in keyof T]: T[P]
}
​

readonly 的含义为,将该属性设置为只读属性,即不可修改,这里 Equal<MyReadonly<Todo1>, Readonly<Todo1>> 是将我们自己写的类型和内置的 readonly 类型做比较,判断二者是不是相同类型。这里只接受一个泛型参数,则传递的应该是类型,而 key 值应该为该类型上的属性 即 [P in keyof T],那么 T[P] 即为键值。在属性前加上关键字 readonly 即可。