TypeScript
Astro vem com suporte integrado para TypeScript. Você pode importar arquivos .ts
e .tsx
em seu projeto Astro, escrever código TypeScript dentro de seu componente Astro, e até mesmo utilizar um arquivo astro.config.ts
se você quiser.
Usando TypeScript, você pode evitar erros em tempo de execução ao definir os formatos dos objetos e componentes no seu código. Por exemplo, se você usa TypeScript para definir o tipo das props do seu componente, você vai receber um erro no seu editor se você definir uma prop que seu componente não aceita.
Você não precisa escrever código TypeScript nos seus projetos com Astro para se beneficiar dele. O Astro sempre trata seu código do componente como TypeScript, e a extensão para VSCode do Astro vai inferir o tanto quanto pode para fornecer preenchimento automático, dicas e erros no seu editor.
O servidor de desenvolvimento do Astro não executará nenhuma checagem de tipos, mas você pode usar um script separado para checar erros de tipo pela linha de comando.
Configuração
Seção intitulada ConfiguraçãoProjetos iniciais do Astro incluem um arquivo tsconfig.json
no seu projeto. Mesmo que você não escreva código TypeScript, esse arquivo é importante para que ferramentas como o Astro e o VS Code saibam como entender o seu projeto. Algumas funcionalidades (como importação de pacotes do npm) não são completamente suportadas em nosso editor sem um arquivo tsconfig.json
. Se você instalar Astro manualmente, certifique-se de criar esse arquivo.
Três templates extensíveis de tsconfig.json
são inclusos no Astro: base
, strict
e strictest
. O template base
habilita suporte para funcionalidades modernas do JavaScript e também é usado como uma base para os outros templates. Nós recomendamos usar strict
(estrito) ou strictest
(mais estrito) se você planeja escrever TypeScript em seu projeto. Você pode ver e comparar a configuração dos três templates em astro/tsconfigs/.
Para herdar de um dos templates, utilize a opção extends
:
Adicionalmente, nossos templates incluem um arquivo env.d.ts
dentro do diretório src
para providenciar tipos de cliente do Vite para seu projeto:
Se você não está usando VSCode, você pode instalar o plugin Astro TypeScript para suportar a importação de arquivos .astro
de arquivos .ts
(que pode ser útil para reexportação).
Então, adicione o seguinte no seu tsconfig.json
:
Para checar que o plugin está funcionando, crie um arquivo .ts
e importe um componente do Astro nele. Você não deve ter nenhuma mensagem de aviso do seu editor.
Frameworks de UI
Seção intitulada Frameworks de UISe o seu projeto utiliza um framework de UI, configurações adicionais dependendo do framework podem ser necessárias. Por favor veja a documentação do TypeScript do seu framework para mais informações. (Vue, React, Preact, Solid)
Importações de Tipos
Seção intitulada Importações de TiposUtilize importações e exportações explícitas de tipos sempre que possível.
Dessa forma, você evita casos extremos onde o bundler do Astro pode tentar incorretamente fazer bundle do seus tipos importados como se fossem JavaScript.
Você pode configurar o TypeScript para reforçar importações de tipos no seu arquivo .tsconfig
. Defina verbatimModuleSyntax
como true
. O TypeScript verificará suas importações e informará quando import type
deve ser usado. Esta configuração está habilitada por padrão em todas as nossas predefinições.
Aliases de Importação
Seção intitulada Aliases de ImportaçãoAstro suporta aliases de importação que você define na configuração paths
do seu tsconfig.json
e jsconfig.json
. Leia nosso guia para aprender mais.
Estendendo window
e globalThis
Seção intitulada Estendendo window e globalThisVocê pode querer adicionar uma propriedade para o objeto global. Você pode fazer isso adicionando declarações de nível superior usando a palavra-chave declare
ao seu arquivo env.d.ts
:
Isso vai fornecer tipos para globalThis.minhaString
e globalThis.minhaFuncao
, assim como para window.minhaString
e window.minhaFuncao
.
Note que window
só está disponível no código no lado do cliente. O globalThis
está disponível no lado do servidor e no lado do cliente, mas seu valor no lado do servidor não é compartilhado com o cliente.
Se você só quer definir o tipo de uma propriedade no objeto window
, forneça uma interface Window
ao invés disso:
Propriedades de Componentes
Seção intitulada Propriedades de ComponentesO Astro suporta a tipagem das propriedades dos seus componentes via TypeScript. Para habilitar, exporte uma interface TypeScript Props
de seu componente Astro. A extensão para VSCode do Astro irá automaticamente procurar pela exportação de Props
e te dar suporte a TypeScript quando você utilizar aquele componente dentro de outro template.
Padrões de tipo de prop comuns
Seção intitulada Padrões de tipo de prop comuns-
Se seu componente nao recebe props ou conteúdo em slot, você pode usar
type Props = Record<string, never>
. -
Se seu componente deve receber filhos em seu slot padrão, você pode impor isso usando
type Props = { children: any; };
.
Utilitários de Tipagem
Seção intitulada Utilitários de Tipagemastro@1.6.0
O Astro vem com alguns tipos utilitários integrados para padrões de tipo de props comuns. Eles estão disponíveis dentro do entrypoint astro/types
.
Atributos HTML integrados
Seção intitulada Atributos HTML integradosO Astro fornece os tipos HTMLAttributes
para checar que sua marcação está usando atributos HTML válidos. Você pode usar esses tipos para ajudar a construir as props de componentes.
Por exemplo, se você está construindo um componente <Link>
, você pode fazer o seguinte para espelhar os atributos padrão de tags <a>
nos tipos da prop do seu componente.
Também é possível estender as definições JSX padrões para adicionar atributos que não são padrões redeclarando o namespace astroHTML.JSX
em um arquivo d.ts
.
astroHTML
é injetado globalmente dentro de componentes .astro
. Para utilizá-lo em arquivos TypeScript, utilize uma diretiva de barra tripla:
Tipo polimórfico
Seção intitulada Tipo polimórficoastro@2.5.0
O Astro inclui um utilitário para tornar mais fácil construir componentes que podem renderizar como elementos HTML diferentes com segurança total de tipo. Isso é útil para componentes como <Link>
que podem renderizar como <a>
ou <button>
dependendo das props passadas para ele.
O exemplo abaixo implementa um componente totalmente tipado e polimórfico que pode renderizar como qualquer elemento HTML. O tipo HTMLTag
é usado para garantir que a prop as
é um elemento HTML válido.
Inferir os tipos do getStaticPaths()
Seção intitulada Inferir os tipos do getStaticPaths()astro@2.1.0
O Astro inclui utilitários para trabalhar com os tipos retornados pela sua função getStaticPaths()
para rotas dinâmicas.
Você pode obter o tipo de Astro.params
com InferGetStaticParamsType
e o tipo de Astro.props
com InferGetStaticPropsType
:
Checagem de Tipos
Seção intitulada Checagem de TiposPara ver erros de tipagem no seu editor, por favor certifique-se de que você tem a extensão Astro para VS Code instalada. Por favor note de que os comandos astro start
e astro build
irão transpilar o código com esbuild, porém você não irá executar nenhuma checagem de tipos. Para prevenir o seu código de fazer build quando conter erros de TypeScript, mude o seu script “build” no package.json
para o seguinte:
astro check
verifica todos os arquivos incluídos em seu projeto TypeScript. Para verificar tipos em arquivos Svelte e Vue, você pode usar os pacotes svelte-check
e vue-tsc
, respectivamente.
📚 Leia mais sobre a importação de arquivos .ts
no Astro.
📚 Leia mais sobre a configuração do TypeScript.
Solução de Problemas
Seção intitulada Solução de ProblemasErros ao fazer a tipagem de múltiplos frameworks JSX ao mesmo tempo
Seção intitulada Erros ao fazer a tipagem de múltiplos frameworks JSX ao mesmo tempoUm problema pode ocorrer ao se utilizar múltiplos frameworks JSX no mesmo projeto, já que cada framework requer configurações diferentes, as vezes até conflitantes, dentro de tsconfig.json
.
Solução: Defina a opção jsxImportSource
para react
(padrão), preact
ou solid-js
dependendo do seu framework mais utilizado. Então, utilize um comentário pragma dentro de quaisquer arquivos conflitantes de outro framework.
Para a opção padrão de jsxImportSource: react
, você usaria: