ref і computed зазвичай виводять тип самі:
const count = ref(0) // Ref<number>
const doubled = computed(() => count.value * 2) // ComputedRef<number>
Явний тип потрібен, коли початкове значення не описує всі можливі:
const user = ref<User | null>(null)
const status = ref<'idle' | 'loading' | 'error'>('idle')
const total = computed<number>(() => items.value.reduce((s, i) => s + i.price, 0))
Посилання на елемент шаблону. У Vue 3.5 для цього є useTemplateRef:
<script setup lang="ts">
import { useTemplateRef, onMounted } from 'vue'
const input = useTemplateRef<HTMLInputElement>('search')
onMounted(() => input.value?.focus())
</script>
<template>
<input ref="search" />
</template>
Зв'язок іде за рядковим ключем з атрибута ref, а не за назвою змінної. Тип можна не вказувати - розширення Vue - Official виводить його з шаблону.
До 3.5 писали ref з тією самою назвою, що й атрибут:
const search = ref<HTMLInputElement | null>(null)
Посилання на дочірній компонент:
import OrderForm from './OrderForm.vue'
const form = useTemplateRef<InstanceType<typeof OrderForm>>('form')
form.value?.reset() // доступно, лише якщо OrderForm зробив defineExpose({ reset })
Що варто пам'ятати:
- значення ref шаблону
nullдо монтування і після розмонтування - тому тип міститьnull, а звертання йде через?.чи вonMounted; - елемент під
v-ifможе зникнути - посилання станеnull; - у
v-forref стає масивом елементів, і його порядок не гарантовано збігається з порядком у масиві даних; shallowRefдоречний для великих об'єктів, які замінюють цілком, - тип той самий, але вміст не стає глибоко реактивним.
Докладніше в документації: TypeScript: типізація ref шаблону