yupで型を付ける方法をご紹介します。スキーマに型を付けることで、バリデーションが効かないなどのミスを防ぐことができるので、yupを使用している人は試してみてください。
環境
yupのバージョンは1.3.3
で動作確認しています。
結論
ObjectSchema
で作成したスキーマに型を付ける
使用例
例1
name
, age
は必須の場合
import * as yup from 'yup';
import type { ObjectSchema } from 'yup';
type User = {
name: string;
age: number;
};
const UserSchema: ObjectSchema<User> = yup.object().shape({
name: yup.string().required(),
age: yup.number().required(),
});
例2
name
は必須、age
は必須でない場合
age
を省略すると型エラーとなるため、必須でない場合でもyup.number().defined()
のようにスキーマを定義します。
import * as yup from 'yup';
import type { ObjectSchema } from 'yup';
type User = {
name: string;
age: number;
};
const UserSchema: ObjectSchema<User> = yup.object().shape({
name: yup.string().required(),
age: yup.number().defined(),
});
例3
name
, age
は必須、address
はage
が20
以上で必須の場合
when
の後(前でも可能)にshape
でスキーマを定義します。
import * as yup from 'yup';
import type { ObjectSchema } from 'yup';
type User = {
name: string;
age: number;
address: {
prefecture: string;
city: string;
};
};
const UserSchema: ObjectSchema<User> = yup.object().shape({
name: yup.string().required(),
age: yup.number().required(),
address: yup
.object()
.when('age', {
is: (age: User['age']) => age >= 20,
then: (schema) =>
schema.shape({
prefecture: yup.string().required(),
city: yup.string().required(),
}),
})
.shape({
prefecture: yup.string().defined(),
city: yup.string().defined(),
}),
});
まとめ
yupに型を付ける方法をご紹介しました。必須でない場合でもdefined
でスキーマを定義しないと型エラーとなるため注意が必要です。
最後に
GoQSystemでは一緒に働いてくれる仲間を募集中です!
ご興味がある方は以下リンクよりご確認ください。