IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    TypeScript挑战(十)- 通用MyReadonly2

    Durban发表于 2020-10-28 19:35:59
    love 0

    TypeScript Challenge - 实现一个通用MyReadonly2<T, K>,它带有两种类型的参数T和K

    题目


    实现一个通用MyReadonly2<T, K>,它带有两种类型的参数T和K。

    K指定应设置为Readonly的属性集(如果T)。如果未提供K,则应使所有属性都变为只读,就像普通的Readonly<T>一样。

    例如

    interface Todo {
      title: string
      description: string
      completed: boolean
    }
    
    const todo: MyReadonly2<Todo, 'title' | 'description'> = {
      title: "Hey",
      description: "foobar",
      completed: false,
    }
    
    todo.title = "Hello" // Error: cannot reassign a readonly property
    todo.description = "barFoo" // Error: cannot reassign a readonly property
    todo.completed = true // OK

    测试用例


    import { Alike, Expect } from '@type-challenges/utils'
    
    type cases = [
      Expect<Alike<MyReadonly2<Todo1>, Readonly<Todo1>>>,
      Expect<Alike<MyReadonly2<Todo1, 'title' | 'description'>, Expected>>,
    ]
    
    interface Todo1 {
      title: string
      description?: string
      completed: boolean
    }
    
    interface Expected {
      readonly title: string
      readonly description?: string
      completed: boolean
    }

    答案


    type MyReadonly2<T, K extends keyof T = keyof T> = {
      readonly [P in K]: T[P]
    } & {
      [P in keyof T]: T[P]
    }

    蒙圈了



沪ICP备19023445号-2号
友情链接