LoginSignup
0
0

Object から null 値を全て undefined に置換する | typescript

Posted at

本記事では以下を実施します

実施事項

  • Javascript の Object 内に null が存在した場合 undefined に置換する
  • Typescript の型判定も null ではなく undefined に変換する

結論

作成したコードを以下に掲載します

type Primitive = number | string | boolean | bigint | symbol | undefined | null;
type Builtin = Primitive | Function | Date | Error | RegExp;
type NonNullableValue<T> = T extends null ? undefined : T;
type NoNNullableObject<T> = {
  [Key in keyof T]: T[Key] extends object ? NoNNullableObject<T[Key]> : NonNullableValue<T[Key]>;
};

export function generateNonNullObject<T>(obj: T): T extends Builtin ? T : NoNNullableObject<T> {
  if (typeof obj !== 'object') {
    return obj as T extends Builtin ? T : NoNNullableObject<T>;
  }

  const _obj: any = {};
  for (const o in obj) {
    if (obj[o] === null) {
      _obj[o] = undefined;
      continue;
    }
    if (typeof obj[o] === 'object') {
      _obj[o] = generateNonNullObject(obj[o]);
      continue;
    }
    _obj[o] = obj[o];
  }
  return _obj;
}

解説

一部パーツを簡単に解説します

type NonNullableValue<T> = T extends null ? undefined : T;
type NoNNullableObject<T> = {
  [Key in keyof T]: T[Key] extends object ? NoNNullableObject<T[Key]> : NonNullableValue<T[Key]>;
};

Typescript の型定義内では変数を用いたり if 分岐を定義することが可能です。本件の場合は null である場合 undefined に置換をしたいため、 T extends null ? undefined : T にて変換を行なっています。 extends の詳細は以下を参照ください。

以下は見たままですが、 object を再起的に走破し、 null の場合は undefined を代入しています。

export function generateNonNullObject<T>(obj: T): T extends Builtin ? T : NoNNullableObject<T> {
  if (typeof obj !== 'object') {
    return obj as T extends Builtin ? T : NoNNullableObject<T>;
  }

  const _obj: any = {};
  for (const o in obj) {
    if (obj[o] === null) {
      _obj[o] = undefined;
      continue;
    }
    if (typeof obj[o] === 'object') {
      _obj[o] = generateNonNullObject(obj[o]);
      continue;
    }
    _obj[o] = obj[o];
  }
  return _obj;
}

以上、何かのお役に立てれば幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0