O que é o Zod? \| TreinaWeb               Promoção no ar   Matricule-se agora e garanta **54% de desconto**  

  Termina em   Tempo restante da oferta: 20 Horas 

 22 Min 

 19 Seg 

   Tempo restante da oferta: 20 22 19 

  [Assinar →](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26) 

   [                ](https://www.treinaweb.com.br)  Explorar  

 [ Quanto custa? ](#assinatura) [ FAQ ](https://www.treinaweb.com.br#faq) [Matricule-se](#assinatura) [ Entrar ](https://www.treinaweb.com.br/login) 

     [ Início ](https://www.treinaweb.com.br) [ Artigos ](https://www.treinaweb.com.br/blog) O que é o Zod?  [ Javascript ](https://www.treinaweb.com.br/blog/categoria/javascript) 

# O que é o Zod?

 Neste artigo vamos ter uma introdução sobre o Zod, uma biblioteca de declaração e validação de dados em TypeScript e criar um exemplo de como utilizá-la.

 [ Wesley Gado ](https://www.treinaweb.com.br/blog/autor/wesley-gado) 3 anos atrás

  ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/12/TS-ZOD.jpg)  

O [Zod](https://zod.dev/) é uma biblioteca de declaração e validação de dados, ou “schema validation” em [TypeScript](https://www.treinaweb.com.br/blog/como-instalar-o-typescript). Dessa forma, é possível criar uma estrutura com os requisitos de dados que você deseja validar.

[  ![TypeScript - Fundamentos](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/typescript.svg)   Curso TypeScript - Fundamentos Conhecer o curso ](https://www.treinaweb.com.br/curso/typescript-fundamentos)

O interessante ao usar o Zod é que ele permite definir tipos de dados utilizando uma sintaxe concisa, garantindo que apenas dados válidos sejam aceitos, o que assegura a segurança do código. Além disso, possui integração com o TypeScript, permitindo o uso de [tipos estáticos e inferência de tipos](https://www.treinaweb.com.br/blog/quais-as-diferencas-entre-tipagens-estatica-ou-dinamica-e-forte-ou-fraca).

Vamos instalar o Zod e criar um exemplo para compreender como o Zod funciona. Para isso, é necessário, primeiramente, criar uma pasta e executar o comando:

```bash
npm init -y

```

Desta forma vamos inicializar um novo projeto e será criado o arquivo `package.json`.

Agora podemos instalar o TypeScript executando o comando:

```bash
npm i --dev typescript

```

Por fim vamos executar o comando para criar o arquivo `tsconfig.json`:

```bash
npx tsc --init

```

Neste momento podemos fazer a instalação do Zod propriamente dita:

```bash
npm install zod

```

Perfeito, agora podemos criar um exemplo.

## Utilizando o Zod para validação de dados

O primeiro passo é criar o “schema”, ou seja, a estrutura que verificará se os dados que estamos tentando validar são válidos. Podemos criar um “schema” que valide os dados de um objeto da seguinte forma:

```tsx
import { z } from "zod";

const carroSchema = z.object({
  modelo: z.string(),
  ano: z.number().min(1990).max(2023),
  fabricante: z.string(),
  cor: z.string().optional()
});

```

Veja que podemos criar uma estrutura onde temos os atributos e os tipos que esses atributos devem ter. No atributo “ano”, além do tipo, definimos que deve ser um número no intervalo de 1990 até 2023. Outro ponto é o atributo “cor”, que pode ser opcional. Ou seja, o Zod permite que, além de definir a estrutura de tipos, também possamos criar validações mais específicas e complexas.

[  ![TypeScript - Avançado](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/typescript.svg)   Curso TypeScript - Avançado Conhecer o curso ](https://www.treinaweb.com.br/curso/typescript-avancado)

Agora, vamos completar este arquivo recebendo um objeto “carro” e validando se as informações estão corretas e como o Zod se comporta:

```tsx
import { z } from "zod";

const carroSchema = z.object({
  modelo: z.string(),
  ano: z.number().min(1990).max(2023),
  fabricante: z.string(),
  cor: z.string().optional()
});

const carro = {
  modelo: "Fiesta",
  ano: 2000,
  fabricante: "Ford",
  cor: "Azul",
};

const validationResult = carroSchema.safeParse(carro); // 

if(!validationResult.success) {
  console.log(validationResult.error);
} else {
  console.log(validationResult.data);
}

```

O método `safeParse()` retorna um objeto com a seguinte estrutura caso a validação ocorra com sucesso:

```json
{
  success: true,
  data: { modelo: 'Fiesta', ano: 2000, fabricante: 'Ford', cor: 'Azul' }
}

```

Ou caso ocorra um erro de validação:

```json
{ success: false, error: [Getter] }

```

Ou seja, podemo utilizar a constante `validationResult` e tratar caso ocorra algum problema, como fizemos acima utilizando o condicional `if`, desta forma, caso `success` seja falso, vamos obter o seguinte retorno na propriedade `error`:

```json
[
  {
    "code": "invalid_type",
    "expected": "number",
    "received": "string",
    "path": [
      "ano"
    ],
    "message": "Expected number, received string"
  }
]

```

Neste caso, o campo “ano” recebeu uma `string` em vez de um dado do tipo `number`. Observe que o Zod nos informa exatamente o que ocorreu, o que é muito interessante!

Dessa forma, você pode tratar os erros da maneira que for necessária para a sua aplicação. Outra observação importante é que há o método `parse()`, no entanto, esse método lança uma exceção caso a validação não ocorra com sucesso.

[  ![Nest.js - Fundamentos](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/nest-js.svg)   Curso Nest.js - Fundamentos Conhecer o curso ](https://www.treinaweb.com.br/curso/nestjs-fundamentos)

Podemos também diretamente no `carroSchema` definir mensagens customizadas para a nossa validação e utilizar a inferência de tipo para criar o tipo `carro` já com as validação, veja como:

```tsx
import { z } from "zod";

const carroSchema = z.object({
  modelo: z.string({
    required_error: "modelo é obrigatório",
    invalid_type_error: "modelo deve ser uma string",
  }),
  ano: z.number({
    required_error: "ano é obrigatório",
    invalid_type_error: "ano deve ser um número"
  }).min(1990).max(2023),
  fabricante: z.string({
    required_error: "fabricante é obrigatório",
    invalid_type_error: "fabricante deve ser uma string"
  }),
  cor: z.string({
    invalid_type_error: "cor deve ser uma string"
  }).optional()
});

type ValidateCarroPayload = z.infer;

const carro: ValidateCarroPayload = {
  modelo: "Fiesta",
  ano: 2005,
  fabricante: "Ford",
  cor: "Prata"
}

const result = carroSchema.safeParse(carro)
console.log(result);

```

Se a validação ocorrer com sucesso:

```tsx
{
  success: true,
  data: { modelo: 'Fiesta', ano: 2005, fabricante: 'Ford', cor: 'Prata' }
}

```

Quando estamos trabalhando com validações personalizadas podemos deixar as validações mais complexas, como por exemplo validar se dois campos são iguais, reaproveitando o exemplo acima, podemos adicionar o campo `renavam` para demostrar essa validação:

```tsx
import { z } from "zod";

const carroSchema = z.object({
  modelo: z.string({
    required_error: "modelo é obrigatório",
    invalid_type_error: "modelo deve ser uma string",
  }),
  ano: z.number({
    required_error: "ano é obrigatório",
    invalid_type_error: "ano deve ser um número"
  }).min(1990).max(2023),
  fabricante: z.string({
    required_error: "fabricante é obrigatório",
    invalid_type_error: "fabricante deve ser uma string"
  }),
  renavam: z.number({
    required_error: "renavam é obrigatório",
    invalid_type_error: "renavam deve ter somente números",
  }),
  renavamConfirmacao: z.number(),
  cor: z.string({
    invalid_type_error: "cor deve ser uma string"
  }).optional()
}).refine((data) =>
data.renavam === data.renavamConfirmacao, { message: "Renavam não está igual" });

type ValidateCarroPayload = z.infer;

const carro: ValidateCarroPayload = {
  modelo: "Fiesta",
  ano: 2015,
  fabricante: "Ford",
  cor: "Prata",
  renavam: 123456,
  renavamConfirmacao: 321654,
}

const result = carroSchema.safeParse(carro)

if(!result.success) {
  console.log(result.error.errors);
} else {
  console.log(result.success);
}

```

Seguindo a mesma lógica do exemplo acima, ao tratar o retorno dentro do condicional `if` para exibir os erros (acessando a propriedade `errors`), no caso de ocorrer algum problema na validação, vamos obter o seguinte resultado:

```tsx
[
  {
    "code": "custom",
    "message": "Renavam não está igual",
    "path": []
  }
]

```

Veja que apontou o erro na validação da propriedade `renavam`.

## Trabalhando com “inputs” e “outputs”

Um recurso interessante do Zod é a possibilidade de trabalhar com tipos diferentes de entrada e saída, mas como isso funciona?

```tsx
const numeroDeCaracteres = z.string().transform((palavra) => palavra.length);

type PalavraEntrada = z.input;
type PalavraSaida = z.output

const palavra: PalavraEntrada = 'Zod';
const numeroDeLetras: PalavraSaida = palavra.length;

console.log(palavra, numeroDeLetras); // Zod 3

console.log(numeroDeCaracteres.parse(palavra)); // 3

```

Veja que temos a constante `numeroDeStrings`, essa constante recebe uma string que será convertida em um number. Podemos utilizar o recurso **input** e **output** para criar tipos diferentes a partir dessa constante e então aplicar conforme as necessidades da nossa aplicação e garantir que estamos trabalhando com os tipos corretos.

Outro recurso que podemos utilizar é sobre o método `parse()` direto na constante palavra, que recebe uma `string` e irá retornar, neste caso, um `number` referente ao número de caracteres da palavra, conforme atribuido na constante `numeroDeCaracteres`.

## Conclusão

Este artigo é uma introdução básica à biblioteca de declaração e validação de dados Zod, onde aprendemos a instalar e utilizar os recursos básicos de validação de forma rápida e clara. Caso você queira aprofundar-se mais na utilização do Zod, aconselho verificar diretamente a [documentação da biblioteca](https://zod.dev/).

Por fim, caso queira aprender mais sobre TypeScript saiba que aqui na [TreinaWeb](https://treinaweb.com.br/) temos o curso [TypeScript - Fundamentos](https://www.treinaweb.com.br/curso/typescript-fundamentos) que possui **01h31 de vídeos** e um total de **30 exercícios**. Conheça também nossos outros cursos de [TypeScript](https://www.treinaweb.com.br/cursos?q=typescript).

Veja quais são os tópicos abordados durante o curso de TypeScript - Fundamentos:

- Compreender melhor as vantagens que a utilização do TypeScript pode trazer;
- Utilizar a tipagem estática que o TypeScript traz;
- Utilizar o conceito de type assertion;
- Aplicar construção e desconstrução (ou decomposição) de objetos no TypeScript;
- Aplicar conceitos típicos de orientação a objetos, como classes, métodos acessores, interfaces e herança com o TypeScript;
- Verificar qual seria o código JavaScript que teria que ser produzido para se obter um efeito análogo à utilização do TypeScript.

- [ #JavaScript ](https://www.treinaweb.com.br/blog/tag/javascript)
- [ #TypeScript ](https://www.treinaweb.com.br/blog/tag/typescript)
- [ #frameworks ](https://www.treinaweb.com.br/blog/tag/frameworks)

Autor

 ![Wesley Gado](//secure.gravatar.com/avatar/1b770ca482a7232b1885881430a592bb?d=mm)

## Wesley Gado

 Formado em Análise e Desenvolvimento de Sistemas pelo Instituto Federal de São Paulo, atuou em projetos como desenvolvedor Front-End. Nas horas vagas grava Podcast e arrisca uns três acordes no violão. 

 [Todos os artigos](https://www.treinaweb.com.br/blog/autor/wesley-gado)  

## Continue estudando

 Transforme leitura em prática com os cursos e formações da TreinaWeb.

 [Ver cursos](https://www.treinaweb.com.br/cursos)   

  Continue lendo

## Artigos relacionados

- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2024/04/sistemas-mensageria-min-400x280.png)  [ Arquitetura de Software ](https://www.treinaweb.com.br/blog/categoria/arquitetura-de-software) 

     3 anos atrás

    ##  [ O que é e quais as diferenças entre Kafka, RabbitMQ e AWSSQS ](https://www.treinaweb.com.br/blog/o-que-e-e-quais-as-diferencas-entre-kafka-rabbitmq-e-awssqs) 

     Confira nesse artigo o que são sistemas de mensageria, o que são e quais as diferenças entre Kafka, RabbitMQ e AWSSQS.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/11/Clean-Architecture-400x280.png)  [ Arquitetura de Software ](https://www.treinaweb.com.br/blog/categoria/arquitetura-de-software) 

     3 anos atrás

    ##  [ O que vem a ser a Clean Architecture? ](https://www.treinaweb.com.br/blog/o-que-vem-a-ser-a-clean-architecture) 

     Confira nesse artigo uma introdução do que é a Clean Architecture, quais seus componentes e os benefícios ao utilizar essa arquitetura.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/08/code-review-400x280.png)  [ Engenharia de Software ](https://www.treinaweb.com.br/blog/categoria/engenharia-de-software) 

     3 anos atrás

    ##  [ O que é code review e quais são os benefícios? ](https://www.treinaweb.com.br/blog/o-que-e-code-review-e-quais-sao-os-beneficios) 

     Confira neste artigo o que vem a ser o code review e quais são os benefícios de colocar isso em prática no seu time.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/05/closure-400x280.jpg)  [ Desenvolvimento ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento) 

     4 anos atrás

    ##  [ O que é Closure ](https://www.treinaweb.com.br/blog/o-que-e-closure) 

     Neste artigo, veremos o que é Closure e por que é tão importante entendê-lo para saber o que acontece por debaixo dos panos na linguagem.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/02/CSS-JS-400x280.jpg)  [ CSS ](https://www.treinaweb.com.br/blog/categoria/css) 

     4 anos atrás

    ##  [ O que é PostCSS e suas funcionalidades ](https://www.treinaweb.com.br/blog/o-que-e-postcss-e-suas-funcionalidades) 

     Neste artigo veremos uma ferramenta que vem auxiliando muito os desenvolvedores durante seus projetos, sendo ela, PostCSS.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/12/BFF-400x280.jpg)  [ Arquitetura de Software ](https://www.treinaweb.com.br/blog/categoria/arquitetura-de-software) 

     4 anos atrás

    ##  [ O que é BFF? ](https://www.treinaweb.com.br/blog/o-que-e-bff) 

     Conheça neste artigo o pattern arquitetural BFF (Backend For Frontend).

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/11/O-QUE-E-HTML-400x280.jpg)  [ Desenvolvimento Front-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-front-end) 

     4 anos atrás

    ##  [ O que é HTML? ](https://www.treinaweb.com.br/blog/o-que-e-html) 

     No artigo de hoje, será abordado o tema HTML, nele irá conter desde sua história, quem o criou e como deve ser montada sua estrutura.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/10/o-que-e-e-como-comecar-com-golang-400x280.jpg)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     4 anos atrás

    ##  [ O que é e como começar com Go (Golang)? ](https://www.treinaweb.com.br/blog/o-que-e-e-como-comecar-com-golang) 

     Neste artigo vamos ter o contato inicial com a linguagem Go (Golag) e aprender um pouco sobre as suas características e como funciona a sua sintaxe.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/09/EVENT-STORMING-400x280.jpg)  [ Arquitetura de Software ](https://www.treinaweb.com.br/blog/categoria/arquitetura-de-software) 

     4 anos atrás

    ##  [ O que é o Event Storming? ](https://www.treinaweb.com.br/blog/o-que-e-o-event-storming) 

     Em situações complexas, pode ser complicado enxergar as fronteiras entre domínios, subdomínios e bounded contexts. Para auxiliar nessa missão, existe uma técnica que pode ser utilizada: trata-se do Event Storming.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/09/TAILWIND-CSS-400x280.jpg)  [ Desenvolvimento Front-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-front-end) 

     4 anos atrás

    ##  [ O que é Tailwind CSS e como instalar via CDN? ](https://www.treinaweb.com.br/blog/o-que-e-tailwind-css-e-como-instalar-via-cdn) 

     Neste artigo aprenderemos a criar um navbar usando Tailwind CSS, e entender melhor como funciona seus componentes de estilização.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/07/o-que-preciso-conhecer-antes-de-iniciar-os-estudos-em-uma-linguagem-de-programacao-400x280.png)  [ Carreira ](https://www.treinaweb.com.br/blog/categoria/carreira) 

     4 anos atrás

    ##  [ O que preciso conhecer antes de iniciar estudos em uma linguagem de programação? ](https://www.treinaweb.com.br/blog/o-que-preciso-conhecer-antes-de-iniciar-estudos-em-uma-linguagem-de-programacao) 

     Essa é uma pergunta muito comum para quem deseja iniciar na área de programação. Por mais que desejamos já começar com uma linguagem e ver tudo acontecendo na tela, é necessário construir uma base antes. Por isso, existem alguns passos importantes antes mesmo de escolher uma linguagem de programação para estudar e é isso que veremos neste artigo.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/03/o-que-e-fastapi-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     5 anos atrás

    ##  [ O que é FastAPI? ](https://www.treinaweb.com.br/blog/o-que-e-fastapi) 

     Neste artigo vamos falar um pouco sobre o funcionamento, história e quais as principais características do framework web FastAPI.

     Ler artigo

## Um ano de acesso total para você viver de programação.

 Todos os cursos e formações da TreinaWeb numa única assinatura, com professores que atuam no mercado, suporte direto e certificados. Do primeiro `console.log` ao mercado de trabalho.

- **1 ano** de acesso a **todos os cursos**
- Cursos novos **toda semana**
- Suporte **direto com professores**
- Plano de carreira **personalizado**
- **Certificados digitais** inclusos
- **Aplicativos** para Android e iOS, com **acesso offline**

    **Garantia incondicional de satisfação** 

 Teste por 7 dias e, se não fizer sentido para você, devolvemos seu dinheiro.

### Acesso completo a todos os cursos e dezenas de Formações.

 12 meses 

  Economize R$ 840,00  54% OFF 

 de 12x R$ 129,00 por apenas

 12x  R$ 59,00

 sem juros no cartão de crédito ou R$ 599,00 à vista

  Oferta termina em  **20h 22min 19s**

- Acesso imediato e ilimitado durante 1 ano.
- Plano de carreira personalizado.
- Suporte direto com professores.
- E muito mais!

 [Matricule-se agora](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26)

     [                ](https://www.treinaweb.com.br)

 Escola online de programação, tecnologia e IA.

- [  ](https://www.facebook.com/TreinaWeb/)
- [  ](https://www.instagram.com/treinaweb/)
- [  ](https://www.youtube.com/user/TreinaWeb)
- [  ](https://twitter.com/treinaweb)
- [  ](https://www.linkedin.com/company/treinaweb)
- [  ](https://github.com/treinaweb)

## Inscreva-se em nossa newsletter

Receba lançamentos, promoções e novidades.

   Seu nome     Seu WhatsApp     Seu melhor e-mail   Inscrever-se 

## Cursos

- [ Base para Devs ](https://www.treinaweb.com.br/categoria/base-para-devs)
- [ Front-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-front-end)
- [ Back-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-back-end)
- [ Mobile ](https://www.treinaweb.com.br/categoria/desenvolvimento-mobile)
- [ Bancos de Dados ](https://www.treinaweb.com.br/categoria/bancos-de-dados)
- [ Cloud ](https://www.treinaweb.com.br/categoria/cloud-computing)
- [ IA ](https://www.treinaweb.com.br/categoria/ia)
- [ E mais ](https://www.treinaweb.com.br/categoria/e-mais)
- [ Ver todos os cursos ](https://www.treinaweb.com.br/cursos)

## Conteúdo

- [ Formações ](https://www.treinaweb.com.br/formacoes)
- [ Projetos práticos ](https://www.treinaweb.com.br/projetos-praticos)
- [ Direto ao ponto ](https://www.treinaweb.com.br/direto-ao-ponto)
- [ Planos ](https://www.treinaweb.com.br#assinatura)
- [ Depoimentos ](https://www.treinaweb.com.br#depoimentos)
- [ Comunidade ](https://www.treinaweb.com.br#comunidade)
- [ Corpo docente ](https://www.treinaweb.com.br#docente)

## A empresa

- [ Sobre a TreinaWeb ](https://www.treinaweb.com.br#sobre)
- [ Perguntas frequentes ](https://www.treinaweb.com.br#faq)
- [ Vantagens de estudar na TreinaWeb ](https://www.treinaweb.com.br/vantagens-de-estudar-na-treinaweb)
- [ Cursos para empresas ](https://www.treinaweb.com.br/empresas)
- [ Sugira um novo curso ](https://www.treinaweb.com.br/sugerir-curso)
- [ Trabalhe conosco ](https://www.treinaweb.com.br/trabalhe-conosco)
- [ Artigos ](https://www.treinaweb.com.br/blog)
- [ Desenvolvedores e agentes ](https://www.treinaweb.com.br/developers)
- [ Contato ](https://www.treinaweb.com.br/contato)
- [ Política de privacidade ](https://www.treinaweb.com.br/politica-de-privacidade)
- [ Termos de uso ](https://www.treinaweb.com.br/termos-de-uso)

## Baixe nosso aplicativo

 [   Disponível na **App Store**  ](https://apps.apple.com/us/app/treinaweb/id1322729447) [   Disponível no **Google Play**  ](https://play.google.com/store/apps/details?id=br.com.treinaweb.mobile) 

  Av. Paulista, 1765, Conj 71 e 72 · Bela Vista · São Paulo · SP · 01311-200   © 2004 – 2026 TreinaWeb Tecnologia LTDA · CNPJ 06.156.637/0001-58
