Vize

Regras de Tipo e Script

Regras de tipo usam o verificador TypeScript quando informações semânticas são necessárias. O Vize lê a mesma forma projeto que o TypeScript lê de tsconfig.json, então nomes de ambientes compartilhados devem vir de compilerOptions.types, referências de projeto ou arquivos de declaração.

Regras de script são regras Patina para API de composição e código orientado a Vapor. Eles focam em padrões que são difíceis de compilar de forma eficiente ou difíceis de raciocinar no modo Vapor.

O linting consciente do tipo é opt-in. Ative-o com linter.typeAware: true, vize lint --type-awareou ativando explicitamente uma regra type/*. type/no-reactivity-loss pode ser ativado diretamente com vize lint --strict-reactivity. Se a Corsa não puder ser iniciada, Patina reporta type/corsa-runtime e pula a passagem de regras com checker, em vez de silenciosamente descartar as regras configuradas.

--type-aware usa a mesma resolução executável Corsa que vize check; Configure typeChecker.corsaPath quando o projeto precisar de um binário tsgo explícito ou Corsa. Os padrões permanecem custo zero: Patina não analisa SFCs para linting com xadrez nem inicia Corsa a menos que a bandeira, linter.typeAware, ou uma regra de type/* explicitamente ativada opte.

export default defineConfig({
  linter: { typeAware: true },
});

type/require-typed-props

Requer que defineProps seja tipado em vez de usar uma declaração de array em tempo de execução.

Gravidade padrão: warning Presets: happy-path, nuxt, opinionated

Ruim:

<script setup lang="ts">
const props = defineProps(["label", "count"]);
</script>

Bom:

<script setup lang="ts">
const props = defineProps<{
  label: string;
  count: number;
}>();
</script>

type/require-typed-emits

Requer defineEmits descreva as cargas úteis de eventos emitidas.

Gravidade padrão: warning Presets: happy-path, nuxt, opinionated

Ruim:

<script setup lang="ts">
const emit = defineEmits(["save"]);

emit("save", form.value);
</script>

Bom:

<script setup lang="ts">
const emit = defineEmits<{
  save: [payload: FormValue];
}>();

emit("save", form.value);
</script>

type/no-unsafe-template-binding

Relatórios de templates bindings que resolvem valores inseguros, como any. A regra é backed por checker, então ela segue os tipos importados e a configuração do projeto.

Gravidade padrão: warning Presets: nuxt, opinionated

Ruim:

<script setup lang="ts">
const payload: any = await loadPayload();
</script>

<template>
  <p>{{ payload.title }}</p>
</template>

Bom:

<script setup lang="ts">
type Payload = { title: string };

const payload = await loadPayload<Payload>();
</script>

<template>
  <p>{{ payload.title }}</p>
</template>

type/no-floating-promises

Relata promessas que são criadas, mas não aguardadas, devolvidas ou intencionalmente tratadas. A verificação cobre tanto expressões <script> quanto modelos.

Gravidade padrão: warning Presets: nuxt, opinionated

Ruim:

<script setup lang="ts">
function submit() {
  saveForm(form.value);
}
</script>

<template>
  <button @click="saveForm(form)">Save</button>
  <p>{{ loadPreview() }}</p>
</template>

Bom:

<script setup lang="ts">
type Preview = { title: string };

async function submit() {
  await saveForm(form.value);
}

const preview = ref<Preview | null>(null);

async function loadPreviewIntoState() {
  preview.value = await loadPreview();
}
</script>

<template>
  <button @click="void submit()">Save</button>
  <button @click="void loadPreviewIntoState()">Preview</button>
  <PreviewPanel v-if="preview" :preview="preview" />
</template>

type/no-reactivity-loss

Reporta instantâneos simples dos valores reativos usados entre fluxos. A regra também é executada quando vize lint --strict-reactivity está ativada.

Gravidade padrão: warning Presets: nuxt, opinionated

Ruim:

<script setup lang="ts">
const props = defineProps<{ item: { name: string } }>();
const item = props.item;
</script>

Bom:

<script setup lang="ts">
const props = defineProps<{ item: { name: string } }>();
const item = toRef(props, "item");
</script>

Configuração do Checker

As regras conscientes de tipos não precisam de um campo separado de globals Vize para nomes TypeScript. Prefira configuração nativa do TypeScript:

Ruim:

export default {
  globals: ["definePageMeta", "process"],
};

Bom:

{
  "compilerOptions": {
    "types": ["node", "nuxt/app"]
  }
}

script/no-options-api

Relatórios Opções Definições de componentes da API em presets orientados ao Vapor.

Gravidade padrão: error Presets: nuxt, opinionated

Ruim:

<script lang="ts">
export default {
  data() {
    return { count: 0 };
  },
};
</script>

Bom:

<script setup lang="ts" vapor>
const count = ref(0);
</script>

script/no-next-tick

Relatórios nextTick() em componentes orientados a vapor. Prefira referências diretas, ganchos de ciclo de vida ou fluxo de estado que não dependa do próximo flush do DOM.

Gravidade padrão: error Presets: nuxt, opinionated

Ruim:

<script setup lang="ts" vapor>
await nextTick();
input.value?.focus();
</script>

Bom:

<script setup lang="ts" vapor>
const input = useTemplateRef<HTMLInputElement>("input");

onMounted(() => {
  input.value?.focus();
});
</script>

script/no-get-current-instance

Relatórios getCurrentInstance() em componentes orientados a vapor. Ele alcança internos de runtime que Vapor não consegue otimizar com segurança.

Gravidade padrão: error Presets: nuxt, opinionated

Ruim:

<script setup lang="ts" vapor>
const instance = getCurrentInstance();
const app = instance?.appContext.app;
</script>

Bom:

<script setup lang="ts" vapor>
const appConfig = useAppConfig();
</script>