EP55 - 使用TypeScript來開發Vue

更新 發佈閱讀 13 分鐘
Using Vue with TypeScript,很久以前就聽過TypeScript了
接下來三篇內容會介紹TypeScript如何開發Vue的狀況吧?
快來看看吧~

像 TypeScript 這樣的類型系統可以通過靜態分析在構建時檢測許多常見錯誤。這減少了在生產環境中出現運行時錯誤的機會,也使我們在大型應用程序中更有信心地進行代碼重構。TypeScript 還通過在集成開發環境 (IDE) 中基於類型的自動完成來改善開發者的使用體驗。

Vue 本身就是用 TypeScript 編寫的,並提供了原生的 TypeScript 支持。所有官方的 Vue 套件都包含了開箱即用的類型聲明。

專案設置 - Project Setup

create-vue,官方的專案腳手架工具,提供了搭建基於 Vite 的 TypeScript 準備好的 Vue 專案的選項。

概覽 - Overview

使用基於 Vite 的設置,開發伺服器和打包器僅進行轉譯,並不進行類型檢查。這確保了即使在使用 TypeScript 的情況下,Vite 開發伺服器仍能保持極快的速度。

  • 在開發過程中,我們建議依賴良好的 IDE 設置來即時反饋類型錯誤。
  • 如果使用單文件組件 (SFC),請使用 vue-tsc 工具進行命令行類型檢查和類型聲明生成。vue-tsc 是 TypeScript 自身命令行介面的包裝器。它的工作方式基本與 tsc 相同,除了它除了支援 TypeScript 文件外,還支援 Vue SFC。您可以在 Vite 開發伺服器運行的同時以監視模式運行 vue-tsc,或者使用像 vite-plugin-checker 的 Vite 插件,該插件在單獨的工作線程中運行檢查。
  • Vue CLI 也提供 TypeScript 支持,但不再建議使用。請參見下面的說明

IDE 支持 - IDE Support

強烈建議使用 Visual Studio Code (VS Code),因為它對 TypeScript 提供了極好的開箱即用支持。

  • Vue - Official(之前的 Volar)是官方的 VS Code 擴展,提供在 Vue SFC 中的 TypeScript 支持,還有許多其他優秀的功能。
提示: Vue - Official 擴展取代了 Vetur,我們之前的官方 VS Code 擴展,適用於 Vue 2。如果您當前在 Vue 3 專案中安裝了 Vetur,請確保在 Vue 3 專案中禁用它。
  • WebStorm 也提供對 TypeScript 和 Vue 的開箱即用支持。其他 JetBrains 的 IDE 也支持它們,無論是開箱即用還是通過免費插件。從 2023.2 版本開始,WebStorm 和 Vue 插件內置支持 Vue 語言伺服器。您可以在設置 > 語言和框架 > TypeScript > Vue 下設置 Vue 服務以使用 Volar 整合,默認情況下,Volar 將用於 TypeScript 版本 5.0 及更高版本。

配置 tsconfig.json - Configuring tsconfig.json

通過 create-vue 建立的專案包括預配置的 tsconfig.json。基礎配置在 @vue/tsconfig 包中進行抽象。在專案中,我們使用專案引用來確保在不同環境中運行的代碼具有正確的類型(例如,應用代碼和測試代碼應有不同的全局變量)。

手動配置 tsconfig.json 時,一些值得注意的選項包括:

  • compilerOptions.isolatedModules 設置為 true,因為 Vite 使用 esbuild 來轉譯 TypeScript,並受單檔轉譯的限制。compilerOptions.verbatimModuleSyntax 是 isolatedModules 的超集,也是良好的選擇 - 這是 @vue/tsconfig 使用的設置。
  • 如果您使用選項 API,則需要將 compilerOptions.strict 設置為 true(或至少啟用 compilerOptions.noImplicitThis,這是嚴格標誌的一部分),以利用組件選項中的類型檢查。否則,這將被視為 any。
  • 如果您在構建工具中配置了解析器別名,例如在 create-vue 專案中默認配置的 @/* 別名,您還需要通過 compilerOptions.paths 為 TypeScript 配置它。
  • 如果您打算在 Vue 中使用 TSX,請將 compilerOptions.jsx 設置為 "preserve",並將 compilerOptions.jsxImportSource 設置為 "vue"。

另請參見:

注意事項關於 Vue CLI 和 ts-loader的說明 - Note on Vue CLI and ts-loader

在基於 webpack 的設置(例如 Vue CLI)中,通常在模組轉換管道中執行類型檢查,例如使用 ts-loader。然而,這並不是一個乾淨的解決方案,因為類型系統需要了解整個模組圖以進行類型檢查。單個模組的轉換步驟根本不適合這項任務。這會導致以下問題:

  • ts-loader 僅能檢查轉換後的代碼類型。這與我們在 IDE 或 vue-tsc 中看到的錯誤不一致,後者直接映射回源代碼。
  • 類型檢查可能會很慢。當它與代碼轉換在同一線程/進程中執行時,會顯著影響整個應用程序的構建速度。
  • 我們已經在 IDE 中以單獨進程運行類型檢查,因此開發體驗的延遲成本並不是一個好的交易。

如果您目前正在通過 Vue CLI 使用 Vue 3 + TypeScript,我們強烈建議遷移到 Vite。我們也在努力提供 CLI 選項以啟用僅轉譯的 TS 支持,這樣您就可以切換到 vue-tsc 進行類型檢查。

一般使用注意事項 - General Usage Notes

defineComponent()

為了讓 TypeScript 正確推斷組件選項中的類型,我們需要使用 defineComponent() 定義組件:

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() 也支援在使用組合式 API 而不使用 <script setup> 時推斷傳遞給 setup() 的 props:

import { defineComponent } from 'vue'

export default defineComponent({
// 啟用類型推斷
props: {
message: String
},
setup(props) {
props.message // 類型:string | undefined
}
})

另請參見:

提示: defineComponent() 也啟用在純 JavaScript 中定義的組件的類型推斷。

在單文件組件中的使用 - Usage in Single-File Components

要在 SFC 中使用 TypeScript,請在 <script> 標籤中添加 lang="ts" 屬性。當 lang="ts" 存在時,所有模板表達式也將享受更嚴格的類型檢查。

<script lang="ts">
import { defineComponent } from 'vue'

export default defineComponent({
data() {
return {
count: 1
}
}
})
</script>

<template>
<!-- 啟用類型檢查和自動完成功能 -->
{{ count.toFixed(2) }}
</template>

lang="ts" 也可以與 <script setup> 一起使用:

<script setup lang="ts">
// 啟用 TypeScript
import { ref } from 'vue'

const count = ref(1)
</script>

<template>
<!-- 啟用類型檢查和自動完成功能 -->
{{ count.toFixed(2) }}
</template>

模板中的 TypeScript - TypeScript in Templates

當使用 <script lang="ts"> 或 <script setup lang="ts"> 時,<template> 也支持綁定表達式中的 TypeScript。這在需要在模板表達式中進行類型轉換的情況下非常有用。

這是一個牽強的例子:

<script setup lang="ts">
let x: string | number = 1
</script>

<template>
<!-- 錯誤,因為 x 可能是字符串 -->
{{ x.toFixed(2) }}
</template>

這可以通過內聯類型轉換來解決:

<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 的使用 - Usage with TSX

Vue 也支持使用 JSX / TSX 編寫組件。詳細內容可參見渲染函數與 JSX 指南。

泛型組件 - Generic Components

泛型組件在兩種情況下得到支持:

特定 API 範例 - API-Specific Recipes

怎麼看完有種空虛的感覺www
還是太菜沒有抓到什麼重點
所以以下問題來了!

所以TypeScript開發vue有什麼好處?

使用 TypeScript 開發 Vue 的好處包括:

  1. 靜態類型檢查:TypeScript 能夠在編譯時檢測許多常見錯誤,減少生產環境中的運行時錯誤。
  2. 更安全的重構:在大型應用中,TypeScript 提供更高的代碼重構信心,因為類型系統能夠幫助確認改動不會破壞現有功能。
  3. 更好的開發體驗:使用 TypeScript 的 IDE 提供類型基於的自動完成功能,提升開發效率。
  4. 原生支持:Vue 是用 TypeScript 開發的,並提供第一級的 TypeScript 支持,官方包含類型聲明,使用起來更方便。
  5. 改善的可維護性:透過明確的類型定義,代碼更加易讀,便於後續維護。

這些優勢使得使用 TypeScript 開發 Vue 應用變得更加高效與可靠。


留言
avatar-img
卡關的人生
4會員
73內容數
分享生活趣事~
卡關的人生的其他內容
2024/11/10
Vue 提供了多種動畫技術來提升應用程式的互動性,包括基於 CSS 類別的動畫、基於狀態的動畫,以及使用監視器來動畫化數值。基於類別的動畫可通過動態添加 CSS 類別來觸發,像是觸發按鈕搖動效果。基於狀態的動畫則是透過樣式綁定,根據互動動態調整元素的外觀,例如根據滑鼠位置改變背景顏色。
Thumbnail
2024/11/10
Vue 提供了多種動畫技術來提升應用程式的互動性,包括基於 CSS 類別的動畫、基於狀態的動畫,以及使用監視器來動畫化數值。基於類別的動畫可通過動態添加 CSS 類別來觸發,像是觸發按鈕搖動效果。基於狀態的動畫則是透過樣式綁定,根據互動動態調整元素的外觀,例如根據滑鼠位置改變背景顏色。
Thumbnail
2024/11/09
Web Components 是一組網頁原生 API,允許開發者創建可重複使用的自訂元素。Vue 與 Web Components 是互補的技術,Vue 支援整合和創建自訂元素。
Thumbnail
2024/11/09
Web Components 是一組網頁原生 API,允許開發者創建可重複使用的自訂元素。Vue 與 Web Components 是互補的技術,Vue 支援整合和創建自訂元素。
Thumbnail
2024/11/08
Vue 建議使用模板構建應用程式,但在需要 JavaScript 的全程式化功能時,渲染函數可派上用場。渲染函數通過 h() 函數創建 vnode,h 是 hyperscript 的簡寫,能生成 HTML 的 JavaScript。
Thumbnail
2024/11/08
Vue 建議使用模板構建應用程式,但在需要 JavaScript 的全程式化功能時,渲染函數可派上用場。渲染函數通過 h() 函數創建 vnode,h 是 hyperscript 的簡寫,能生成 HTML 的 JavaScript。
Thumbnail
看更多
你可能也想看
Thumbnail
測試對於構建複雜的 Vue 應用至關重要,因為它能防止回歸並鼓勵將應用拆分為可測試的模組。我們介紹了測試的基本術語和推薦的工具,包括單元測試、組件測試和端對端測試。建議越早開始測試,避免隨著時間推移而增加的相依性。單元測試專注於函數和邏輯的正確性,而組件測試則驗證 UI 元素的行為與交互。
Thumbnail
測試對於構建複雜的 Vue 應用至關重要,因為它能防止回歸並鼓勵將應用拆分為可測試的模組。我們介紹了測試的基本術語和推薦的工具,包括單元測試、組件測試和端對端測試。建議越早開始測試,避免隨著時間推移而增加的相依性。單元測試專注於函數和邏輯的正確性,而組件測試則驗證 UI 元素的行為與交互。
Thumbnail
長期以來,西方美學以《維特魯威人》式的幾何比例定義「完美身體」,這種視覺標準無形中成為殖民擴張與種族分類的暴力工具。本文透過分析奈及利亞編舞家庫德斯.奧尼奎庫的舞作《轉轉生》,探討當代非洲舞蹈如何跳脫「標本式」的文化觀看。
Thumbnail
長期以來,西方美學以《維特魯威人》式的幾何比例定義「完美身體」,這種視覺標準無形中成為殖民擴張與種族分類的暴力工具。本文透過分析奈及利亞編舞家庫德斯.奧尼奎庫的舞作《轉轉生》,探討當代非洲舞蹈如何跳脫「標本式」的文化觀看。
Thumbnail
使用 TypeScript 開發 Vue 的好處包括:靜態類型檢查可減少運行時錯誤,提升代碼重構的安全性。TypeScript 提供更好的開發體驗,因為 IDE 支持類型自動完成功能。
Thumbnail
使用 TypeScript 開發 Vue 的好處包括:靜態類型檢查可減少運行時錯誤,提升代碼重構的安全性。TypeScript 提供更好的開發體驗,因為 IDE 支持類型自動完成功能。
Thumbnail
Vue 是一個靈活且可逐步採用的框架,適用於不同使用情境以平衡技術棧複雜度、開發者體驗和最終性能。Vue 可以作為獨立腳本文件使用,不需構建步驟,適合簡單前端邏輯。也可用來構建標準 Web 組件,嵌入到任何 HTML 頁面中。對於需要豐富互動性的應用,可構建單頁應用程式 (SPA)。
Thumbnail
Vue 是一個靈活且可逐步採用的框架,適用於不同使用情境以平衡技術棧複雜度、開發者體驗和最終性能。Vue 可以作為獨立腳本文件使用,不需構建步驟,適合簡單前端邏輯。也可用來構建標準 Web 組件,嵌入到任何 HTML 頁面中。對於需要豐富互動性的應用,可構建單頁應用程式 (SPA)。
Thumbnail
Vue.js 的事件修飾符提供了一種簡化和直觀的方式來處理事件。與傳統 JavaScript 中需要手動檢查條件和處理事件相比,Vue 的修飾符(如 .prevent、.stop、.enter)使代碼更加清晰和易於管理。這些修飾符直接在模板中指定事件行為,減少了樣板代碼,提升了可讀性。
Thumbnail
Vue.js 的事件修飾符提供了一種簡化和直觀的方式來處理事件。與傳統 JavaScript 中需要手動檢查條件和處理事件相比,Vue 的修飾符(如 .prevent、.stop、.enter)使代碼更加清晰和易於管理。這些修飾符直接在模板中指定事件行為,減少了樣板代碼,提升了可讀性。
Thumbnail
Vue 3을 사용한 소프트웨어 개발 최근 웹 개발에서 Vue.js는 매우 인기 있는 JavaScript 프레임워크 중 하나입니다. Vue 3은 그 이전 버전인 Vue 2에 비해 많은 기능 개선과 성능 향상이 이루어졌습니다. 이번 글에서는 Vue 3을 사용하여 소프트웨
Thumbnail
Vue 3을 사용한 소프트웨어 개발 최근 웹 개발에서 Vue.js는 매우 인기 있는 JavaScript 프레임워크 중 하나입니다. Vue 3은 그 이전 버전인 Vue 2에 비해 많은 기능 개선과 성능 향상이 이루어졌습니다. 이번 글에서는 Vue 3을 사용하여 소프트웨
Thumbnail
若說易卜生的《玩偶之家》為 19 世紀的女性,開啟了一扇離家的窄門,那麼《海妲.蓋柏樂》展現的便是門後的窒息世界。本篇文章由劇場演員 Amily 執筆,同為熟稔文本的演員,亦是深刻體察制度縫隙的當代女性,此文所看見的不僅僅是崩壞前夕的最後發聲,更是女人被迫置於冷酷的制度之下,步步陷入無以言說的困境。
Thumbnail
若說易卜生的《玩偶之家》為 19 世紀的女性,開啟了一扇離家的窄門,那麼《海妲.蓋柏樂》展現的便是門後的窒息世界。本篇文章由劇場演員 Amily 執筆,同為熟稔文本的演員,亦是深刻體察制度縫隙的當代女性,此文所看見的不僅僅是崩壞前夕的最後發聲,更是女人被迫置於冷酷的制度之下,步步陷入無以言說的困境。
Thumbnail
在使用 Vue 組件 API 和 TypeScript 的開發中,通常會遇到類型錯誤和需要 debug 的情況。組件 API 下的 TypeScript 提供了更強的型別檢查和類型推斷功能,這有助於減少錯誤。
Thumbnail
在使用 Vue 組件 API 和 TypeScript 的開發中,通常會遇到類型錯誤和需要 debug 的情況。組件 API 下的 TypeScript 提供了更強的型別檢查和類型推斷功能,這有助於減少錯誤。
Thumbnail
本文深度解析賽勒布倫尼科夫的舞臺作品《傳奇:帕拉贊諾夫的十段殘篇》,如何以十段殘篇,結合帕拉贊諾夫的電影美學、象徵意象與當代政治流亡抗爭,探討藝術在儀式消失的現代社會如何承接意義,並展現不羈的自由靈魂。
Thumbnail
本文深度解析賽勒布倫尼科夫的舞臺作品《傳奇:帕拉贊諾夫的十段殘篇》,如何以十段殘篇,結合帕拉贊諾夫的電影美學、象徵意象與當代政治流亡抗爭,探討藝術在儀式消失的現代社會如何承接意義,並展現不羈的自由靈魂。
Thumbnail
Vite 作為輕量快速的建置工具,原生支持 Vue SFC,並且提供簡化的配置與優越的開發體驗。文章還介紹了 IDE 支援、測試工具(如 Cypress 和 Vitest)、Linting 和格式化工具的使用,幫助開發者提高開發效率與代碼質量。
Thumbnail
Vite 作為輕量快速的建置工具,原生支持 Vue SFC,並且提供簡化的配置與優越的開發體驗。文章還介紹了 IDE 支援、測試工具(如 Cypress 和 Vitest)、Linting 和格式化工具的使用,幫助開發者提高開發效率與代碼質量。
Thumbnail
在生產部署中,Vue 提供開發環境及生產環境的最佳實踐。開發階段有錯誤警告、驗證等功能,但生產環境須去除開發代碼以提升效能。未使用建構工具時,建議使用 .prod.js 生產版;使用工具如 Vite 或 Vue CLI 時,已預設生產配置,適合進行部署。
Thumbnail
在生產部署中,Vue 提供開發環境及生產環境的最佳實踐。開發階段有錯誤警告、驗證等功能,但生產環境須去除開發代碼以提升效能。未使用建構工具時,建議使用 .prod.js 生產版;使用工具如 Vite 或 Vue CLI 時,已預設生產配置,適合進行部署。
Thumbnail
全新版本的《三便士歌劇》如何不落入「復刻經典」的巢臼,反而利用華麗的秀場視覺,引導觀眾在晚期資本主義的消費愉悅之中,而能驚覺「批判」本身亦可能被收編——而當絞繩升起,這場關於如何生存的黑色遊戲,又將帶領新時代的我們走向何種後現代的自我解構?
Thumbnail
全新版本的《三便士歌劇》如何不落入「復刻經典」的巢臼,反而利用華麗的秀場視覺,引導觀眾在晚期資本主義的消費愉悅之中,而能驚覺「批判」本身亦可能被收編——而當絞繩升起,這場關於如何生存的黑色遊戲,又將帶領新時代的我們走向何種後現代的自我解構?
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News