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.
