【类型挑战】Readonly 2,难度⭐️⭐️

简介: 【类型挑战】Readonly 2,难度⭐️⭐️

知识运用:


  1. 认识和使用Omit。
  2. 认识和使用Pick。
  3. 认识和使用。


题目分析:


题目地址:8-medium-readonly-2image.png如上图所示,这道题目涉及的内容较多,难度对于刚学类型编程不就的伙伴来说挺难的,我们先参考社区的答案来解析,后续巩固。


题目解答:


测试用例:

本次测试用例重点关注前两个即可,一个是需要全部处理为Readonly,而另一个需要对指定的KEY处理为Readonly。

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


答案及解析:

  1. 假如我们传入了K,那么需要处理为Readonly的对象我们可以使用Pick选出这几个key组成的对象类型。
  2. 再借用内置的Readonly工具将这个对象类型直接处理。
  3. 那么为指定到K的属性不就丢了吗?我们可以使用Omit来排除掉已传入K的两个后得到剩余的一个K。
  4. 在通过&将两个对象类型链接起来得到一个完整的满足2,3用例的答案。
  5. 右边的说完了,再看下左边,我们通常的K就直接通过extends keyof T来约束必须在T中存在了。这个K extends keyof T = keyof T是什么意思呢?哪位伙伴说一下?
/* _____________ 答案 _____________ */
type MyReadonly2<T, K extends keyof T = keyof T> = Omit<T, K> & Readonly<Pick<T, K>>;



相关文章
|
测试技术
【类型挑战】深度 Readonly,难度⭐️⭐️
【类型挑战】深度 Readonly,难度⭐️⭐️
310 0
【类型挑战】深度 Readonly,难度⭐️⭐️
|
测试技术 索引
【类型挑战】实现 Readonly,难度⭐️
【类型挑战】实现 Readonly,难度⭐️
187 0
【类型挑战】实现 Readonly,难度⭐️
|
测试技术 索引
【类型挑战】实现 Omit,难度⭐️⭐️
【类型挑战】实现 Omit,难度⭐️⭐️
242 0
【类型挑战】实现 Omit,难度⭐️⭐️
|
测试技术 索引
【类型挑战】最后一个元素,难度⭐️⭐️
【类型挑战】最后一个元素,难度⭐️⭐️
117 0
【类型挑战】最后一个元素,难度⭐️⭐️
|
测试技术
【类型挑战】获取函数返回类型,难度⭐️⭐️
【类型挑战】获取函数返回类型,难度⭐️⭐️
143 0
【类型挑战】获取函数返回类型,难度⭐️⭐️
|
测试技术 索引
【类型挑战】Includes,难度⭐️
【类型挑战】Includes,难度⭐️
156 0
【类型挑战】Includes,难度⭐️
|
JavaScript 测试技术 索引
【类型挑战】第一个元素,难度⭐️
【类型挑战】第一个元素,难度⭐️
118 0
【类型挑战】第一个元素,难度⭐️
|
测试技术
【类型挑战】Push,难度⭐️
【类型挑战】Push,难度⭐️
129 0
【类型挑战】Push,难度⭐️
|
测试技术
【类型挑战】Unshift,难度⭐️
【类型挑战】Unshift,难度⭐️
113 0
【类型挑战】Unshift,难度⭐️
|
JavaScript 前端开发 测试技术
【类型挑战】Concat,难度⭐️
【类型挑战】Concat,难度⭐️
142 0
【类型挑战】Concat,难度⭐️