👌

zodのz.objectをz.inferした結果がname?:stringのようにoptionalになってしまう

2023/12/22に公開

概要

zod で、以下のように z.object で作成したスキーマから z.infer で型を求めた時、
基本的には全て必須項目になるはずですがなぜか optional になってしまう事象が起きました。

GitHub の Issue などもあったのですが、起きている事象からだと調べにくいかもと思い記事にしようと思います。

export const userSchema = z.object({
  name: z.string(),
});

export type User = z.infer<typeof userSchema>;

/*
User型の内容。各プロパティに"?"が付いてoptionalになっている

type User = {
    id?: string;
    name?: string;
    email?: string;
    createdAt?: string;
    updatedAt?: string;
}
*/

原因

tsconfig.json で strictNullChecks が false に設定されていると上記のように各プロパティが optional なプロパティになるようです。

最初から TypeScript でプロジェクトを始める場合は strict: true で始めることが多いので通常問題が起きないと思いますが、
何らかの理由で strict: false にしたり strictNullChecks だけ false にした場合、この形が起きると思います。

ドキュメントを改めて見ると最初の Requirements のところで You must enable strict mode と記述されており、大前提のようでした...。

関連資料

Discussion