Nullishなデータ、Nullableなデータ、Undefinableなデータ、Neatなデータ~zodを使って表現~
こんにちわ。nap5です。
Nullishなデータ、Nullableなデータ、Undefinableなデータについて紹介したいと思います。
前回の記事と関連です。
zodのAPI使わなくても表現できることをいまさら気づいたので、バニラでトライしてみました。スキーマ部分はzodで表現しています。
最初に定義しておくと捗りそうです。
import { z } from "zod";
type Builtin =
| number
| string
| boolean
| bigint
| symbol
| Function
| Date
| Error
| RegExp
| null
| undefined;
type BuiltinOmitNull = Exclude<Builtin, null>;
type BuiltinOmitUndefined = Exclude<Builtin, undefined>;
type DeepNullish<T> = T extends Builtin
? T
: { [key in keyof T]?: DeepNullish<T[key]> | null | undefined };
type DeepNonUndefinable<T> = T extends BuiltinOmitNull
? NonNullable<T>
: { [key in keyof T]-?: DeepNonUndefinable<T[key]> };
type DeepNonNullable<T> = T extends BuiltinOmitUndefined
? NonNullable<T>
: { [key in keyof T]: DeepNonNullable<T[key]> };
const AuthorSchema = z.object({
id: z.number(),
name: z.string(),
blogs: z
.object({
id: z.number(),
title: z.string(),
createdAt: z.date(),
})
.array(),
});
type Author = z.infer<typeof AuthorSchema>;
type AuthorNullishData = DeepNullish<Author> | null | undefined;
type AuthorNullableData = DeepNonUndefinable<AuthorNullishData> | null;
type AuthorUndefinableData = DeepNonNullable<AuthorNullishData> | undefined;
const dataNullish: AuthorNullishData = {
id: 1,
name: undefined,
blogs: null,
};
const dataNullable: AuthorNullableData = {
id: null,
name: null,
blogs: null,
};
const dataUndefined: AuthorUndefinableData = {
id: undefined,
name: undefined,
blogs: undefined,
};
const dataNeat: Author = {
id: 1,
name: "Cowboy",
blogs: [
{
id: 1,
title: "Some",
createdAt: new Date(),
},
],
};
デモコードです。
簡単ですが、以上です。
この記事が気に入ったらサポートをしてみませんか?