17973-medium-deepmutable

Back

type DeepMutable<T extends object> = {
  -readonly [P in keyof T]: T[P] extends Function ? T[P] : T[P] extends object ? DeepMutable<T[P]> : T[P];
};

Solution by sunupupup #33476

// your answers
type DeepMutable<T> =  {
  -readonly [P in keyof T]: T[P] extends object ? T[P] extends Function ? T[P] : DeepMutable<T[P]> : T[P]
}

Solution by pea-sys #33395

type DeepMutable<T extends object> = T extends (...args: any) => any 
  ? T 
  : { - readonly [key in keyof T]: T[key] extends object ? DeepMutable<T[key]> : T[key] }

Solution by kanishev #33009

// your answers
type DeepMutable<T extends object> = {
  -readonly [P in keyof T]: T[P] extends object ? T[P] extends Function ? T[P] : DeepMutable<T[P]> : T[P]
}

Solution by Kakeru-Miyazaki #30898

type DeepMutable<T extends object> = 
  T extends (...args: any[]) => unknown 
    ? T : T extends {[propertyKey: string | number]: any} 
      ? {
        -readonly [K in keyof T]: DeepMutable<T[K]>
      } 
    : T

Solution by sv-98-maxin #30154

type DeepMutable<T> = {
  -readonly [key in keyof T]: T[key] extends object ? T[key] extends Function ? T[key] : DeepMutable<T[key]> : T[key]
}

Solution by tclxshunquan-wang #29844

type DeepMutable<T extends Record<keyof any, any>> = T extends (
  ...args: any[]
) => unknown
  ? T
  : {
      -readonly [P in keyof T]: T[P] extends Record<keyof any, any>
        ? DeepMutable<T[P]>
        : T[P];
    };

Solution by DoubleWoodLin #28891

这题一步步来即可

如果 value 是对象则需要继续递归处理,这里注意 Record<string, any> 的子类型还有 Function,需要处理一下

因为传入的值都是 readonly 的,需要去除一下,采用 - readonly 去除

type DeepMutable<T> = T extends Record<string, any>
  ? {
  - readonly [K in keyof T]: T[K] extends Record<string, any> 
    ? T[K] extends (...args: any[]) => any
      ? T[K]
      : DeepMutable<T[K]>
    : T[K]
} : T

Solution by linjunc #28340

type DeepMutable<T> = {
  -readonly [k in keyof T]: DeepMutable<T[k]>;
} & {};

Solution by ryuji-1to #27690

type DeepMutable<T> =
  T extends (...args: infer P) => infer R
  ? (...args: P) => R
  : T extends object
  ? { -readonly [K in keyof T]
    : DeepMutable<T[K]> }
  : T

Solution by smileboyi #27271

type DeepMutable<T> = {
  -readonly [K in keyof T]: T[K] extends ((...args: any[]) => any) ? T[K] : DeepMutable<T[K]>
}

Solution by XkSuperCool #26339

// your answers
type DeepMutable<T extends object> = {
  -readonly [K in keyof T]: T[K] extends Function ? T[K] : T[K] extends object ? DeepMutable<T[K]> : T[K]
}

Solution by studymachiney #24944

// your answers
type DeepMutable<T extends object> = {
  -readonly [K in keyof T]: T[K] extends Function ? T[K] : T[K] extends object ? DeepMutable<T[K]> : T[K]
}

Solution by studymachiney #24744

type DeepMutable<T extends object> = { -readonly [P in keyof T]:
  T[P] extends Function ? T[P] :
  T[P] extends object ? DeepMutable<T[P]> :
  T[P] };

// old way
// type DeepMutable<T extends { [x: PropertyKey]: any }> =
//   {
//     -readonly [P in keyof T]:
//     (T[P] extends Function ?
//       T[P] :  //函数直接返回
//       (T[P] extends { [x: PropertyKey]: any } ?
//         DeepMutable<T[P]> :   //结构体继续遍历
//         T[P])
//     )
//   };

Solution by E-uler #24557

type DeepMutable<T extends object> = {
  -readonly [Key in keyof T]: T[Key] extends Record<string, unknown> | readonly unknown[]
    ? DeepMutable<T[Key]>
    : T[Key]
}

Solution by NeylonR #24374

// your answers
type DeepMutable<T extends object> = {
  -readonly [K in keyof T]: T[K] extends object ? T[K] extends Function ? T[K] : DeepMutable<T[K]> : T[K]
}

Solution by snakeUni #23344

// 你的答案
type DeepMutable<T> = {
  -readonly [K in keyof T]: T[K] extends object ? T[K] extends Function ? T[K] : DeepMutable<T[K]> : T[K]
}

Solution by jxhhdx #22759

type DeepMutable<T extends object> = {
  -readonly [K in keyof T]: T[K] extends Function ? T[K] : T[K] extends object ? DeepMutable<T[K]> : T[K]
}

Playground

Solution by teamchong #22537

type DeepMutable<T extends Record<PropertyKey, any>> = {
  -readonly [Key in keyof T]: T[Key] extends (...args: any[]) => any ? T[Key] : DeepMutable<T[Key]>
}

Solution by drylint #22150

// 你的答案
type DeepMutable<T extends object>
    = T extends (...argv: infer P) => infer R ? (...argv: P) => R
    : T extends unknown[] ? (
        T extends [infer A, ... infer B extends unknown[]]
        ? [A extends object ? DeepMutable<A> : A, ...DeepMutable<B>]
        : T
    )
    : {
        -readonly [K in keyof T]
        : T[K] extends object
        ? DeepMutable<T[K]>
        : T[K] extends unknown[]
        ? DeepMutable<T[K]>
        : T[K]
    }

type test = DeepMutable<{
    readonly sdf: [[36, [3, {
        readonly a: '',
        readonly c: 33
    }, 4,]], {
        readonly b: 'b',
        readonly c: {
            readonly a: ''
            readonly b: ['']
        }
    }]
}>

Solution by goddnsgit #21809

type DeepMutable<T extends object> = {
  -readonly [K in keyof T]: T[K] extends object
    ? T[K] extends Function
      ? T[K]
      : DeepMutable<T[K]>
    : T[K]
}

Solution by rin-st #21164

type DeepMutable<T> = {
  -readonly [key in keyof T]: T[key] extends any[]
    ? DeepMutable<T[key]>
    : T[key] extends Function
    ? T[key]
    : T[key] extends object
    ? DeepMutable<T[key]>
    : T[key];
};

Solution by venusliang #20894

type DeepMutable<T  extends Record<string,any>> = {
  -readonly[P in keyof T]:T[P] extends Record<string,any> ?
  T[P] extends (...anys: any[]) => any ? T[P]:
   DeepMutable<T[P]>:
  T[P]
}

Solution by so11y #20841

// your answers
type DeepMutable<T extends object> = {
  -readonly[K in keyof T] : T[K] extends object ? T[K] extends (...anys: any[]) => any ? T[K] : DeepMutable<T[K]> : T[K]
}

Solution by YqxLzx #20252

// your answers
type DeepMutable<T> = {
  -readonly [Key in keyof T]: T[Key] extends object
    ? DeepMutable<T[Key]>
    : T[Key];
};

Solution by fengjinlong #20110

type DeepMutable<T extends Record<PropertyKey, any>> = {
  -readonly [P in keyof T]: 
    T[P] extends Record<PropertyKey, any>
      ? T[P] extends Function
        ? T[P]
        : DeepMutable<T[P]> 
      : T[P]
}

Solution by zhaoyao91 #19902

type DeepMutable<T extends object> = {
  -readonly [K in keyof T]: T[K] extends object ? (T[K] extends (...anys: any[]) => any ? T[K] : DeepMutable<T[K]>) : T[K];
};

Solution by CaoXueLiang #18923

type DeepMutable<T extends Record<keyof any,any>> =
  T extends (...args:any[])=>any?
    T:
    {
      - readonly [K in keyof T]:DeepMutable<T[K]>
    }

Solution by jiangshanmeta #18259

type DeepMutable<T extends Record<string, any>> = T extends Record<string, any>
  ? {
      -readonly [k in keyof T]: T[k] extends Record<string, any>
        ? T[k] extends (...args: any[]) => any
          ? T[k]
          : DeepMutable<T[k]>
        : T[k];
    }
  : T;

Solution by cc-hearts #18135

type Value = string | number | symbol | boolean | bigint | undefined | null | Function

type DeepMutable<T extends Record<PropertyKey, any>> = {
  - readonly [P in keyof T]: T[P] extends Value ? T[P] : DeepMutable<T[P]>
}

Solution by milletlovemouse #18048