Использование Vue с TypeScript
Такая система типов, как TypeScript, может обнаружить множество распространённых ошибок с помощью статического анализа во время сборки. Это снижает вероятность возникновения ошибок во время выполнения в продакшене, а также позволяет более уверенно рефакторить код в масштабных приложениях. TypeScript также улучшает эргономику разработчика благодаря автодополнению типов в IDE.
Vue написан на TypeScript и обеспечивает первоклассную поддержку TypeScript. Все официальные пакеты Vue поставляются с декларациями типов, которые должны работать «из коробки».
Настройка проекта
create-vue
, официальный инструмент для создания проектов, предлагает возможности для создания проекта Vue на базе Vite с поддержкой TypeScript.
Обзор
При установке на основе Vite сервер разработки и пакетный модуль выполняют только транспиляцию и не выполняют проверку типов. Благодаря этому сервер разработки Vite остается молниеносно быстрым даже при использовании TypeScript.
Во время разработки мы рекомендуем полагаться на хорошую настройку IDE для мгновенной обратной связи с ошибками типа.
При использовании SFC используйте утилиту
vue-tsc
для проверки типов в командной строке и генерации объявлений типов.vue-tsc
— это обёртка дляtsc
, собственного интерфейса командной строки TypeScript. Работает в основном так же, как иtsc
, за исключением того, что поддерживает Vue SFC в дополнение к файлам TypeScript. Вы можете запуститьvue-tsc
в режиме watch параллельно с сервером разработки Vite, или использовать плагин Vite, например vite-plugin-checker, который запускает проверки в отдельном рабочем потоке.Vue CLI также обеспечивает поддержку TypeScript, но больше не рекомендуется. Смотрите примечания ниже.
Поддержка IDE
Visual Studio Code (VS Code) настоятельно рекомендуется благодаря отличной встроенной поддержке TypeScript.
Vue - Official (ранее — Volar) — официальное расширение VS Code, обеспечивающее поддержку TypeScript в SFC Vue, а также множество других замечательных возможностей.
Совет
Расширение Vue - Official заменяет Vetur, наше предыдущее официальное расширение VS Code для Vue 2. Если у вас установлен Vetur, не забудьте отключить его в проектах Vue 3.
WebStorm также обеспечивает встроенную поддержку TypeScript и Vue. Другие IDE от JetBrains тоже поддерживают их, либо из коробки, либо с помощью бесплатного плагина. Начиная с версии 2023.2, WebStorm и плагин Vue Plugin поставляются со встроенной поддержкой Vue Language Server. Вы можете настроить службу Vue на использование интеграции Volar для всех версий TypeScript в разделе Settings > Languages & Frameworks > TypeScript > Vue. По умолчанию Volar будет использоваться для TypeScript версий 5.0 и выше.
Настройка tsconfig.json
Проекты, созданные с помощью create-vue
, включают в себя предварительно настроенный tsconfig.json
. Базовый конфиг абстрагирован в пакете @vue/tsconfig
. Внутри проекта мы используем Project References, чтобы обеспечить правильные типы для кода, работающего в разных средах (например, код приложения и тестовый код должны иметь разные глобальные переменные).
Если настраивать tsconfig.json
вручную, можно воспользоваться следующими примечательными опциями:
compilerOptions.isolatedModules
имеет значениеtrue
, поскольку Vite использует esbuild для транспиляции TypeScript и подвержен ограничениям на транспиляцию одного файла.compilerOptions.verbatimModuleSyntax
является надмножествомisolatedModules
и тоже является хорошим выбором — именно его использует@vue/tsconfig
.Если вы используете Options API, вам необходимо установить
compilerOptions.strict
вtrue
(или, по крайней мере, включитьcompilerOptions.noImplicitThis
, который является частью флагаstrict
), чтобы задействовать проверку типаthis
в опциях компонента. В противном случаеthis
будет рассматриваться какany
.Если вы настроили псевдонимы резольвера в вашем инструменте сборки, например псевдоним
@/*
, настроенный по умолчанию в проектеcreate-vue
, вам нужно также настроить его для TypeScript черезcompilerOptions.paths
.
См. также:
- Официальная документация по опциям компилятора TypeScript
- Предостережения по компиляции TypeScript в esbuild
Примечание о Vue CLI и ts-loader
.
В системах на основе webpack, таких как Vue CLI, принято выполнять проверку типов как часть конвейера преобразования модулей, например, с помощью ts-loader
. Однако это не совсем верное решение, поскольку для проверки типов системе типов необходимо знать весь граф модуля. Шаг преобразования отдельного модуля просто не подходит для этой задачи. Это приводит к следующим проблемам:
ts-loader
может проверять только посттрансформационный код. Это не совпадает с ошибками, которые мы видим в IDE или вvue-tsc
, которые отображаются непосредственно в исходном коде.Проверка типов может быть медленной. Когда она выполняется в одном потоке/процессе с преобразованиями кода, это существенно влияет на скорость сборки всего приложения.
У нас уже есть проверка типов, выполняемая прямо в IDE в отдельном процессе, так что стоимость замедления работы разработчика просто не является хорошим компромиссом.
Если вы в настоящее время используете Vue 3 + TypeScript через Vue CLI, мы настоятельно рекомендуем перейти на Vite. Мы также работаем над параметрами CLI, чтобы включить поддержку TS только для транспилирования, чтобы вы могли переключиться на vue-tsc
для проверки типов.
Общие замечания по использованию
defineComponent()
Чтобы TypeScript мог правильно выводить типы в опциях компонентов, нам нужно определить компоненты с помощью defineComponent()
:
ts
import { defineComponent } from 'vue'
export default defineComponent({
// включение вывода типа
props: {
name: String,
msg: { type: String, required: true }
},
data() {
return {
count: 1
}
},
mounted() {
this.name // тип: string | undefined
this.msg // тип: string
this.count // тип: number
}
})
defineComponent()
также поддерживает вывод параметров, переданных в setup()
, при использовании Composition API без <script setup>
:
ts
import { defineComponent } from 'vue'
export default defineComponent({
// включение вывода типа
props: {
message: String
},
setup(props) {
props.message // тип: string | undefined
}
})
См. также:
Примечание
defineComponent()
также позволяет определять тип компонентов, определённых на обычном JavaScript.
Использование в однофайловых компонентах
Чтобы использовать TypeScript в SFC, добавьте атрибут lang="ts"
к тегам <script>
. Когда присутствует lang="ts"
, все шаблонные выражения также имеют более строгую проверку типов.
vue
<script lang="ts">
import { defineComponent } from 'vue'
export default defineComponent({
data() {
return {
count: 1
}
}
})
</script>
<template>
<!-- включена проверка типа и автозавершение -->
{{ count.toFixed(2) }}
</template>
lang="ts"
также можно использовать с <script setup>
:
vue
<script setup lang="ts">
// TypeScript включен
import { ref } from 'vue'
const count = ref(1)
</script>
<template>
<!-- включена проверка типа и автозавершение -->
{{ count.toFixed(2) }}
</template>
TypeScript в шаблонах
Шаблон <template>
также поддерживает TypeScript в выражениях привязки, когда используется <script lang="ts">
или <script setup lang="ts">
. Это полезно в тех случаях, когда необходимо выполнить приведение типов в шаблонных выражениях.
Вот надуманный пример:
vue
<script setup lang="ts">
let x: string | number = 1
</script>
<template>
<!-- ошибка, потому что x может быть строкой -->
{{ x.toFixed(2) }}
</template>
Это можно обойти с помощью приведения строчного типа:
vue
<script setup lang="ts">
let x: string | number = 1
</script>
<template>
{{ (x as number).toFixed(2) }}
</template>
Примечание
При использовании Vue CLI или установки на основе webpack, TypeScript в выражениях шаблонов требует vue-loader@^16.8.0
.
Использование с TSX
Vue также поддерживает авторские компоненты с JSX/TSX. Подробности описаны в руководстве Рендер-функции и JSX.
Универсальные компоненты
Универсальные компоненты поддерживаются в двух случаях:
- В однофайловых компонентах:
<script setup>
с атрибутомgeneric
- Рендер-функция / компоненты JSX: Сигнатура функции
defineComponent()