typescript - Varför gör Zod alla mina schemafält valfria?


Jag använder Zod i mitt Express- och TypeScript- och Mongoose-API-projekt och när jag försöker validera min användarinmatning mot användarschemat returnerar det typkonflikter:

  Argument of type '{ firstName?: string; lastName?: string; password?: string; passwordConfirmation?: string; email?: string; }' is not assignable to parameter of type 'UserInput'.
      Property 'email' is optional in type '{ firstName?: string; lastName?: string; password?: string; passwordConfirmation?: string; email?: string; }' but required in type 'UserInput'

Här är schemadefinitionen:

export const createUserSchema = object({
  body: object({
    firstName: string({
      required_error: 'First name is required',
    }),
    lastName: string({
      required_error: 'Last name is required',
    }).nonempty(),
    password: string({
      required_error: 'Password is required',
    })
      .nonempty()
      .min(6, 'Password too short - should be 6 chars minimum'),

    passwordConfirmation: string({
      required_error: 'Confirm password is required',
    }),
    email: string({
      required_error: 'Email is required',
    })
      .email('Not a valid email')
      .nonempty(),
  }).refine((data) => data.password === data.passwordConfirmation, {
    message: 'Passwords do not match',
    path: ['passwordConfirmation'],
  }),
});

export type CreateUserInput = Omit<TypeOf<typeof createUserSchema>, 'body.passwordConfirmation'>;


export interface UserInput {
  email: string;
  firstName: string;
  lastName: string;
  password: string;
}

Hur gör man så att dessa Zod-schemafält inte är valfria alls eftersom de är valfria som standard?

Svar #1

Detta kan orsakas av att strict: true inte används i TypeScript-kompilatoralternativen som hänvisas till i installationsavsnittet i README-filen.

Följande grundläggande tsconfig.json-fil skulle åtgärda det:

{
    "compilerOptions": {
        "strict": true   
    }
}

Svar #2

Som påpekats av @pr0gramist i kommentarerna, bör det accepterade svaret vara att lägga till denna inställning i din tsconfig.json:

{
    "compilerOptions": {
        "strictNullChecks": true   
    }
}

Beroende på din standardkonfiguration för zod kan du behöva lägga till detta i dina scheman också:

requiredField: z.string().min(1)

Denna metod är mindre påträngande än en "strict": true, vilket lägger till fler TypeScript-begränsningar i din kodbas.

Relaterade artiklar