Type-challenges:00009-medium-deepReadonly

Implement a generic DeepReadonly<T> which make every parameter of an object - and its sub-objects recursively - readonly.

https://github.com/TIMPICKLE/type-challenges/blob/main/questions/00009-medium-deep-readonly/README.md

 虽然是medium,但是刷题顺序还是归为了简单题。

简单描述一下,递归的将每个对象及其子对象变为readonly

 同样的,先用JS+递归形式,实现一版,找到其逻辑

function mydeepReadonly(obj){
    // 首先确定返回值是一个对象
    result = {};
    
    //递归地遍历这个对象
    //首先要找到递归出口
    for(let key in obj){
        if(obj.hasOwnProperty(key)===true){
            //判断是sub节点是否为一个对象
            if(obj[key] instanceof Object){
                //递归入口
                mydeepReadonly(obj[key]);
            }else{
                // 递归出口
                result['readonly '+key] = obj[key];
            }
        }
    };

    return result;

};

let X = { 
    x: { 
      a: 1,
      b: 'hi'
    },
    y: 'hey'
  }

console.log(mydeepReadonly(X));

看一下ts-challenge的测试用例:

 过啦!

好的现在用TS来实现一遍:

思路整理:

1. 返回一个类型

2. 对于sub-object,进行递归调用

3. 递归的时候,需要判断递归的入口和出口,ts里面就用 extends来进行类型限制

type myDeepReaonly<T> = {
    readonly [P in keyof T]: T[P] extends (Record<PropertyKey, unknown>)
    ? myDeepReaonly<T[P]>
    : T[P]
};

declare type PropertyKey = string | number | symbol; 这个很有意思,使用索引签名来检索是否为sub-object。

三元表达式来判断是否需要递归。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

董厂长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值