Использование Vue с TypeScript
Такая система типов, как TypeScript, позволяет выявлять многие распространенные ошибки с помощью статического анализа на этапе сборки. Это снижает вероятность возникновения ошибок во время выполнения в production, а также позволяет более уверенно рефакторить код в крупномасштабных приложениях. 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 dev или использовать плагин Vite, например vite-plugin-checker, который выполняет проверки в отдельном рабочем потоке.Vue CLI также обеспечивает поддержку TypeScript, но больше не рекомендуется. Смотрите примечания ниже.
Поддержка IDE
Visual Studio Code (VS Code) настоятельно рекомендуется для использования благодаря отличной встроенной поддержке TypeScript.
Vue - Официальное (ранее Volar) — официальное расширение VS Code, которое обеспечивает поддержку TypeScript внутри Vue SFC, а также множество других замечательных функций.
Совет
Vue — официальное расширение заменяет Vetur, наше предыдущее официальное расширение VSCode для Vue 2. Если у вас уже установлен Vetur, обязательно отключите его в проектах Vue 3.
WebStorm также обеспечивает встроенную поддержку TypeScript и Vue. Другие IDE JetBrains также поддерживают их, либо из коробки, либо с помощью бесплатного плагина.
Настройка tsconfig.json
Проекты, создаваемые с помощью create-vue
, включают в себя предварительно сконфигурированный tsconfig.json
. Базовый конфиг абстрагирован в пакете @vue/tsconfig
. Внутри проекта мы используем Project References для обеспечения корректных типов кода, работающего в разных окружениях (например, код приложения и код тестирования должны иметь разные глобальные переменные).
При ручной настройке tsconfig.json
следует обратить внимание на следующие параметры:
compilerOptions.isolatedModules
имеет значениеtrue
поскольку Vite использует esbuild для транспиляции TypeScript и имеет ограничения на транспиляцию одним файлом.При использовании API Options необходимо установить
compilerOptions.strict
вtrue
(или, по крайней мере, включитьcompilerOptions.noImplicitThis
, который является частью флагаstrict
), чтобы задействовать проверку типаthis
в опциях компонента. В противном случаеthis
будет рассматриваться какany
.Если вы настроили псевдонимы распознавателя в инструменте сборки, например псевдоним
@/*
, настроенный по умолчанию в проектеcreate-vue
, необходимо также настроить его для TypeScript с помощьюcompilerOptions.paths
.Если вы собираетесь использовать TSX с Vue, установите
CompilerOptions.jsx
в"preserve"
и установитеCompilerOptions.jsxImportSource
в"vue"
.
См. также:
- Официальная документация по параметрам компилятора TypeScript
- Предостережения при компиляции esbuild TypeScript
Примечание о 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
Generic
компоненты
Generic
компоненты поддерживаются в двух случаях:
- В
SFC
:<script setup>
сgeneric
атрибутом - Рендер-функции /
JSX
компоненты: сигнатура функцииdefineComponent()