@vee-validate/yup

vee-validate integration with yup schema validation
3,409,323 11,260
Install
npm install @vee-validate/yup
Latest Version:4.15.1
Vue:3
License:MIT
Last Updated:Mar 4, 2026
Links: GitHub  ·  npm
Maintainer: logaretm

@vee-validate/yup

Official vee-validate integration with Yup schema validation

Getting started

You can use yup as a typed schema with the @vee-validate/yup package:

# npm
npm install @vee-validate/yup
# yarn
yarn add @vee-validate/yup
# pnpm
pnpm add @vee-validate/yup

The @vee-valdiate/yup package exposes a toTypedSchema function that accepts any yup schema. Which then you can pass along to validationSchema option on useForm.

This makes the form values and submitted values typed automatically and caters for both input and output types of that schema.

import { useForm } from 'vee-validate';
import { object, string } from 'yup';
import { toTypedSchema } from '@vee-validate/yup';

const { values, handleSubmit } = useForm({
  validationSchema: toTypedSchema(
    object({
      email: string().required(),
      password: string().required(),
      name: string(),
    })
  ),
});

// ❌ Type error, which means `values` is type-safe
values.email.endsWith('@gmail.com');

handleSubmit(submitted => {
  // No errors, because email is required!
  submitted.email.endsWith('@gmail.com');

  // ❌ Type error, because `name` is not required so it could be undefined
  // Means that your fields are now type safe!
  submitted.name.length;
});

Yup default values

You can also define default values on your schema directly and it will be picked up by the form:

import { useForm } from 'vee-validate';
import { object, string } from 'yup';
import { toTypedSchema } from '@vee-validate/yup';

const { values, handleSubmit } = useForm({
  validationSchema: toTypedSchema(
    object({
      email: string().required().default('something@email.com'),
      password: string().required().default(''),
      name: string().default(''),
    })
  ),
});

Your initial values will be using the schema defaults, and also the defaults will be used if the values submitted is missing these fields.

Yup transforms

You can also define transforms to cast your fields before submission:

import { useForm } from 'vee-validate';
import { object, number } from 'yup';
import { toTypedSchema } from '@vee-validate/yup';

const { values, handleSubmit } = useForm({
  validationSchema: toTypedSchema(
    object({
      age: number()
        .transform(val => Number(val))
        .required(),
    })
  ),
});

But note that this does not change the input or output types of the casted fields. The cast will only occur when setting the initial value and when the values are submitted.

Related Packages

vee-validate

Painless forms for Vue.js

45,982,707 11,260
@vee-validate/zod

vee-validate integration with zod schema validation

13,782,300 11,260
@vee-validate/rules

Form Validation for Vue.js

9,053,946 11,260
@vee-validate/valibot

vee-validate integration with valibot schema validation

511,682 11,260

Version History

Version Released License
4.15.1 MIT
4.15.0 MIT
4.14.7 MIT
4.14.6 MIT
4.14.5 MIT
Pre-releases (2)
Version Released License
4.12.0-alpha.1 MIT
4.12.0-alpha.0 MIT