Validating your Vue Props like a Pro

Fotis Adamakis
Vue.js Developers
Published in
3 min readAug 9, 2022

Vue requires to explicit declare any data passed to a component as props. Additionally, it provides a powerful built-in mechanism to validate this data. This acts as a contract between the component and the consumer and ensures that the component is used as intended.

Let's explore this powerful tool which can help us reduce bugs and increase our confidence during development and debugging.

The basics

Primitive types

Validating primitive types is as easy as setting the type option to the primitive type constructor.

Complex types

Complex types can also be validated in the same way.

The type can be one of the following values:

  • Number
  • String
  • Boolean
  • Array
  • Object
  • Date
  • Function
  • Symbol

In addition, type can also be a custom class or constructor function, and the assertion will be made with an instanceof check. For example, given the following class:

You could use it as a prop type like this:

Advanced validation

Validator function

Props support the usage of a validator function. This function accepts the raw value of the prop and must return a boolean to determine if this prop is valid or not.

Using enums ✨

Sometimes you want to narrow the values down to a specific set which can be done by faking an enum like this:

Which can be imported and used in both the validator and as a default value.

Lastly, the parent component can also import and use this enum that eliminates the usage of magic strings from our application.

ℹ️ Symbols is an alternative way to define enum values, when casting to a string is not needed. [example]

Boolean Casting

Boolean props have unique behaviour. The existence or absence of the attribute can determine the prop value.

TypeScript

Combining Vue's built-in prop validation with TypeScript can give us even more control over this mechanism since TypeScript natively supports interfaces and enums.

Interfaces ✨

We can use an interface and the PropType utility to annotate complex prop types. This ensures that the passed object will have a specific structure.

Real enums ✨

We have already explored how to fake an enum in Javascript. This is not needed for TypeScript since enums are natively supported.

Vue 3

All the above are valid when using Vue 3 with either Options or Composition API. The difference is when using <script setup>. Props have to be declared using the defineProps() macro like this:

Or when using TypeScript with <script setup>It's possible to declare props using pure type annotations:

Or using an interface:

Finally, declaring default values when using the type-based declaration:

Conclusion

Type checking is a great first line of defence against bugs as your application grows in size. Vue's built-in prop validation is compelling. Combined with TypeScript, it can give you high confidence in properly using a component interface, reducing bugs and improving the overall code quality and development experience.

--

--

Fotis Adamakis
Vue.js Developers

« Senior Software Engineer · Author · International Speaker · Vue.js Athens Meetup Organizer »