TypeScript во Vue.js используется для строгой типизации данных, компонентов и логики приложения. Он позволяет выявлять ошибки на этапе компиляции, улучшает автодополнение в IDE, повышает читаемость кода и упрощает сопровождение крупных проектов. Vue начиная с версии 3 изначально спроектирован с учётом TypeScript, что делает его использование нативным и удобным.
Ключевая особенность — TypeScript не является обязательным, но его интеграция максимально прозрачна и не требует сложной настройки.
Vue 3 переписан на TypeScript почти полностью. Это повлияло на:
Благодаря этому пользовательский код получает максимальную поддержку типов без дополнительной конфигурации.
Single File Component (SFC) поддерживает TypeScript напрямую через
атрибут lang="ts".
<script lang="ts">
import { defineComponent } from 'vue'
export default defineComponent({
name: 'UserCard'
})
</script>
Компилятор Vue корректно обрабатывает TypeScript-код, а шаблон
автоматически получает информацию о типах, определённых в
script.
При использовании Options API типизация осуществляется через generics и явные аннотации.
data(): { count: number } {
return {
count: 0
}
}
Методы и вычисляемые свойства могут быть типизированы явно, но подход становится громоздким при росте сложности.
Composition API предоставляет более естественную интеграцию с TypeScript.
import { ref } from 'vue'
const count = ref<number>(0)
Тип значения внутри ref выводится автоматически, а при
необходимости может быть задан явно.
Для reactive используется вывод типов на основе
объекта:
const state = reactive({
name: 'Alice',
age: 25
})
TypeScript автоматически создаёт тип на основе структуры объекта.
Props типизируются через generics или объектную запись.
import { defineComponent, PropType } from 'vue'
export default defineComponent({
props: {
title: {
type: String,
required: true
},
user: {
type: Object as PropType<{ id: number; name: string }>,
required: true
}
}
})
В <script setup> типизация становится ещё
проще:
defineProps<{
title: string
user: {
id: number
name: string
}
}>()
События также строго типизируются.
defineEmits<{
(e: 'update', value: number): void
(e: 'submit'): void
}>()
Это предотвращает передачу неверных аргументов и упрощает поддержку событий.
Vue автоматически связывает типы из script с
шаблоном:
setup доступны с корректными типамиПример ошибки, выявляемой TypeScript:
Слоты могут быть типизированы через интерфейсы:
defineSlots<{
default(props: { item: string }): any
}>()
Это позволяет контролировать структуру данных, передаваемых в слоты, особенно в библиотечных компонентах.
При использовании dependency injection рекомендуется выносить ключи в символы с типами:
const UserKey = Symbol() as InjectionKey<User>
provide(UserKey, user)
const user = inject(UserKey)
TypeScript гарантирует соответствие типов между provide
и inject.
Vue хорошо сочетается с типами из сторонних библиотек:
Пример с Pinia:
export const useUserStore = defineStore('user', {
state: () => ({
id: 0 as number,
name: '' as string
})
})
Типы состояния, геттеров и экшенов выводятся автоматически.
Vue Router поддерживает строгую типизацию параметров маршрутов:
{
path: '/users/:id',
name: 'user',
component: UserView,
props: route => ({ id: Number(route.params.id) })
}
В компоненте id будет иметь корректный тип.
Асинхронные функции типизируются стандартными средствами TypeScript:
const fetchUser = async (): Promise<User> => {
const response = await api.get<User>('/user')
return response.data
}
Это позволяет контролировать структуру данных, получаемых с сервера.
Основные инструменты:
vue-tsc — проверка типов SFCVolar — язык-сервер для IDEtsconfig.json — управление строгими режимамиРекомендуемые настройки:
"strict": true"noImplicitAny": true"strictNullChecks": trueany и
unknownОсновные принципы:
anyreadonly для неизменяемых данныхTypeScript во Vue.js — не надстройка, а фундаментальная часть современной архитектуры приложений, обеспечивающая надёжность, масштабируемость и предсказуемость поведения кода.