見出し画像

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(),
    },
  ],
};


デモコードです。



簡単ですが、以上です。


この記事が気に入ったらサポートをしてみませんか?