本記事では以下を実施します
実施事項
- 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;
}
以上、何かのお役に立てれば幸いです。