Skip to content

Latest commit

 

History

History

0007-Readonly-easy

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

7 Readonly

关键词: TypeScript, TypeChallenge

实现内置的Readonly<T>泛型.
构造一个类型,并将 T 的所有属性设置为只读,这意味着无法重新对所构造类型的属性进行赋值

例如

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

答案

type MyReadonly<T> = {
  readonly [K in keyof T]: T[K];
};

分析

遍历T的每一个 key, 对每一个K添加 readonly描述符 , 而K对应的值的类型即为对象上原本的类型T[K]

伪码:

function MyReadonly(T) {
  const returnType = {};

  // 获得 T 上所有的 key
  for (let K in T) {
    returnType[K] = readonly(T[K]);
  }

  return returnType;
}