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

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

知识运用:


  1. 基础对象Readonly处理。
  2. 递归在类型编程中的运用。
  3. 如果类型的内容是函数类型,那么keyof得到的事never类型。


题目分析:


题目地址:9-medium-deep-readonlyimage.png如上图所示,我们需要设计一个通用的类型工具可以将一个深度嵌套的对象的key全部处理成readonly。


题目解答:


测试用例:

测试用例比较简单,我们来看答案解析吧。

/* _____________ 测试用例 _____________ */
import type { Equal, Expect } from '@type-challenges/utils'
type cases = [
  Expect<Equal<DeepReadonly<X>, Expected>>,
]
type X = {
  a: () => 22
  b: string
  c: {
    d: boolean
    e: {
      g: {
        h: {
          i: true
          j: 'string'
        }
        k: 'hello'
      }
      l: [
        'hi',
        {
          m: ['hey']
        },
      ]
    }
  }
}
type Expected = {
  readonly a: () => 22
  readonly b: string
  readonly c: {
    readonly d: boolean
    readonly e: {
      readonly g: {
        readonly h: {
          readonly i: true
          readonly j: 'string'
        }
        readonly k: 'hello'
      }
      readonly l: readonly [
        'hi',
        {
          readonly m: readonly ['hey']
        },
      ]
    }
  }
}
复制代码


答案及解析:

  1. 输入类型这个就不错过多的限制了,接收T即可。
  2. 实现我们最基础的:{ readonly [k in keyof T]: T[k] }
  3. 当T[key]可能是对象类型,所以还是使用DeepReadonly递归处理{ readonly [k in keyof T]: DeepReadonly<T[k]> }
  4. 我们还需要对T的每个key进行限制,限制key不能是never类型的才需要只读处理。
type DeepReadonly<T> = keyof T extends never ? T : {readonly [k in keyof T]: DeepReadonly<T[k]>};
复制代码


去演练场验证答案



相关文章
|
测试技术
【类型挑战】Readonly 2,难度⭐️⭐️
【类型挑战】Readonly 2,难度⭐️⭐️
152 0
【类型挑战】Readonly 2,难度⭐️⭐️
|
测试技术 索引
【类型挑战】实现 Omit,难度⭐️⭐️
【类型挑战】实现 Omit,难度⭐️⭐️
254 0
【类型挑战】实现 Omit,难度⭐️⭐️
|
测试技术 索引
【类型挑战】最后一个元素,难度⭐️⭐️
【类型挑战】最后一个元素,难度⭐️⭐️
121 0
【类型挑战】最后一个元素,难度⭐️⭐️
|
测试技术 索引
【类型挑战】实现 Readonly,难度⭐️
【类型挑战】实现 Readonly,难度⭐️
191 0
【类型挑战】实现 Readonly,难度⭐️
|
测试技术
【类型挑战】获取函数返回类型,难度⭐️⭐️
【类型挑战】获取函数返回类型,难度⭐️⭐️
149 0
【类型挑战】获取函数返回类型,难度⭐️⭐️
|
测试技术 API
【类型挑战】元组转联合,难度⭐️⭐️
【类型挑战】元组转联合,难度⭐️⭐️
179 0
【类型挑战】元组转联合,难度⭐️⭐️
|
JavaScript 测试技术 索引
【类型挑战】第一个元素,难度⭐️
【类型挑战】第一个元素,难度⭐️
122 0
【类型挑战】第一个元素,难度⭐️
|
JavaScript 前端开发 测试技术
【类型挑战】出栈,难度⭐️⭐️
【类型挑战】出栈,难度⭐️⭐️
149 0
【类型挑战】出栈,难度⭐️⭐️
|
测试技术
【类型挑战】Unshift,难度⭐️
【类型挑战】Unshift,难度⭐️
116 0
【类型挑战】Unshift,难度⭐️
|
JavaScript 前端开发 测试技术
【类型挑战】Concat,难度⭐️
【类型挑战】Concat,难度⭐️
146 0
【类型挑战】Concat,难度⭐️