一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第19天,点击查看活动详情

Dear,大家好,我是“前端小鑫同学”,😇长期从事前端开发,安卓开发,热衷技术,在编程路上越走越远~


知识运用:

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

    题目分析:

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

    题目解答:

    测试用例:

    测试用例比较简单,我们来看答案解析吧。 ```typescript / _ 测试用例 _ / import type { Equal, Expect } from ‘@type-challenges/utils’

type cases = [ Expect, 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. <a name="EpXWc"></a>
  2. #### 答案及解析:
  3. 1. 输入类型这个就不错过多的限制了,接收T即可。
  4. 1. 实现我们最基础的:`{ readonly [k in keyof T]: T[k] }`;
  5. 1. 当T[key]可能是对象类型,所以还是使用DeepReadonly递归处理`{ readonly [k in keyof T]: DeepReadonly<T[k]> }`;
  6. 1. 我们还需要对T的每个key进行限制,限制key不能是never类型的才需要只读处理。
  7. ```typescript
  8. type DeepReadonly<T> = keyof T extends never ? T : {readonly [k in keyof T]: DeepReadonly<T[k]>};

去演练场验证答案

接下来的一题是:【类型挑战】元组转联合,难度⭐️⭐️


欢迎关注我的公众号“前端小鑫同学”,原创技术文章第一时间推送。