Open2

undefinedをnullに置き換える型パズル

hanetsukihanetsuki
type UndefinedToNullByPrimitive<T> = T extends undefined ? null : T;

type UndefinedToNull<T> = T extends object
  ? {
      [K in keyof T]: UndefinedToNull<T[K]>;
    }
  : UndefinedToNullByPrimitive<T>;
type A = {
  a: undefined;
  b: string;
  c: {
    c_a: undefined;
    c_b: number | undefined;
    c_c: {
      c_c_a: string;
      c_c_b: null;
      c_c_c: [null, string, undefined, undefined | number, { a: string, b: undefined | string }];
    };
  };
  d: null;
};

type B = string;

type C = undefined;

type D = [null, string, undefined, undefined | number, { a: string, b: undefined | string }];
type A = UndefinedToNull<Hoge>;
// type A = {
//   a: null;
//   b: string;
//   c: {
//       c_a: null;
//       c_b: number;
//       c_c: {
//           c_c_a: string;
//           c_c_b: null;
//       };
//   };
//   d: null;
// }
type B = UndefinedToNull<Foo>;
// type B = string
type C = UndefinedToNull<Piyo>;
// type C = null