EP55 - 使用TypeScript來開發Vue

更新於 2024/11/01閱讀時間約 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
2會員
71內容數
分享生活趣事~
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
卡關的人生 的其他內容
允許未經過濾的使用者內容執行會帶來攻擊風險。建議參考 HTML5 Security Cheat Sheet 和 OWASP's XSS Prevention Cheat Sheet,並檢查依賴項源代碼是否存在危險模式。
網站可及性(a11y)是指創建任何人都能使用的網站,無論是殘障人士、網速緩慢的用戶、使用過時或損壞硬體的人,還是處於不利環境中的人。例如,為視頻添加字幕能幫助聾人和聽力受損者,也能幫助處於嘈雜環境中的人。設計考慮應包括色彩對比、字體選擇、文本大小和語言。
頁面加載性能可透過PageSpeed Insights、WebPageTest等工具測量,而更新性能則需使用Chrome DevTools、Vue DevTools等進行分析。提升頁面加載性能的技術包括選擇合適架構(SSR或SSG)、(tree-shaking)、(code splitting)等。
在生產部署中,Vue 提供開發環境及生產環境的最佳實踐。開發階段有錯誤警告、驗證等功能,但生產環境須去除開發代碼以提升效能。未使用建構工具時,建議使用 .prod.js 生產版;使用工具如 Vite 或 Vue CLI 時,已預設生產配置,適合進行部署。
Server-Side Rendering (SSR) 是將 Vue.js 組件在伺服器上渲染為 HTML 字串,並直接發送到瀏覽器的一種技術。這樣可以提升頁面顯示速度,尤其在網速慢或設備性能差的情況下。SSR 應用的代碼可在伺服器和客戶端上共享,提高開發效率。
測試對於構建複雜的 Vue 應用至關重要,因為它能防止回歸並鼓勵將應用拆分為可測試的模組。我們介紹了測試的基本術語和推薦的工具,包括單元測試、組件測試和端對端測試。建議越早開始測試,避免隨著時間推移而增加的相依性。單元測試專注於函數和邏輯的正確性,而組件測試則驗證 UI 元素的行為與交互。
允許未經過濾的使用者內容執行會帶來攻擊風險。建議參考 HTML5 Security Cheat Sheet 和 OWASP's XSS Prevention Cheat Sheet,並檢查依賴項源代碼是否存在危險模式。
網站可及性(a11y)是指創建任何人都能使用的網站,無論是殘障人士、網速緩慢的用戶、使用過時或損壞硬體的人,還是處於不利環境中的人。例如,為視頻添加字幕能幫助聾人和聽力受損者,也能幫助處於嘈雜環境中的人。設計考慮應包括色彩對比、字體選擇、文本大小和語言。
頁面加載性能可透過PageSpeed Insights、WebPageTest等工具測量,而更新性能則需使用Chrome DevTools、Vue DevTools等進行分析。提升頁面加載性能的技術包括選擇合適架構(SSR或SSG)、(tree-shaking)、(code splitting)等。
在生產部署中,Vue 提供開發環境及生產環境的最佳實踐。開發階段有錯誤警告、驗證等功能,但生產環境須去除開發代碼以提升效能。未使用建構工具時,建議使用 .prod.js 生產版;使用工具如 Vite 或 Vue CLI 時,已預設生產配置,適合進行部署。
Server-Side Rendering (SSR) 是將 Vue.js 組件在伺服器上渲染為 HTML 字串,並直接發送到瀏覽器的一種技術。這樣可以提升頁面顯示速度,尤其在網速慢或設備性能差的情況下。SSR 應用的代碼可在伺服器和客戶端上共享,提高開發效率。
測試對於構建複雜的 Vue 應用至關重要,因為它能防止回歸並鼓勵將應用拆分為可測試的模組。我們介紹了測試的基本術語和推薦的工具,包括單元測試、組件測試和端對端測試。建議越早開始測試,避免隨著時間推移而增加的相依性。單元測試專注於函數和邏輯的正確性,而組件測試則驗證 UI 元素的行為與交互。
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
如何在 Vite 專案中安裝和設置 TypeScript 及路徑別名的步驟,包括安裝必要的依賴、配置 vite.config.js、tsconfig.json 的設置,及如何創建類型聲明文件來正確識別 .vue 文件。
Thumbnail
各位使用 Vue.js 開發的小夥伴們,你們都怎麼實作父子層組件資料的雙向綁定呢?如果你還在寫 prop + emit 的話,不妨進來看看吧。
Thumbnail
一般在使用 TypeScript 的時候,大家都有遇過定義列舉資料的情境吧。 不過不管是 enum 和 literal 的方式其實都有些小缺點,以下推薦一個個人認為體驗更好的方式。
Thumbnail
在 TypeScript 中,套件是模組化代碼的集合,可以提高代碼的可重用性和可維護性。常見的套件包括各種庫和框架,如 lodash、express 等。以下是有關引用套件、自定義套件和常見套件的詳細介紹。
Thumbnail
本章節旨在介紹 TypeScript 的基本資料型別,包括內建型別、型別轉換、自訂型別、元組、集合、陣列、和字典型別。透過理解和使用這些型別,可以提高代碼的可讀性和可維護性。
Thumbnail
本章節將引導你如何建立一個TypeScript開發環境,這包括安裝Node.js、npm和TypeScript,建立一個TypeScript項目,設置編輯器,以及編寫和編譯TypeScript代碼。在完成這些步驟之後,你將能夠編寫、編譯和運行TypeScript代碼。
Thumbnail
本章節旨在介紹TypeScript的基本語法,包括一般結構、程式進入點、註解以及變數的定義和賦值。這些知識將幫助讀者瞭解TypeScript的基本架構,並且可以開始使用TypeScript進行開發。
Thumbnail
TypeScript是一種由Microsoft開發和維護的開源編程語言。它是JavaScript的超集,主要擴展了JavaScript的語法,增加了靜態類型檢查和其他特性,使得開發大型應用程序更為方便和可靠。
Thumbnail
因為最近想嘗試編碼風格,於是就選了一套比較"不嚴格"的輔助工具來摸索。 編輯器 VS CODE 框架 VUE3 打包工具 VITE 編碼風格 Standard 環境 version { "nodejs":"v18.18.0", "npm":"9.8.1" }
Thumbnail
平常我們在 html 上常看到的例如 v-for、v-model 等等... 也是VUE已經幫我們定義好的指令,而這次我們可以依這自己的需求來建立。 此功能屬於較進階的功能,因此實戰中會比較少見,市面上還是有不少完善的套件能達到同樣效果,建議可以先往這方面察找
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
如何在 Vite 專案中安裝和設置 TypeScript 及路徑別名的步驟,包括安裝必要的依賴、配置 vite.config.js、tsconfig.json 的設置,及如何創建類型聲明文件來正確識別 .vue 文件。
Thumbnail
各位使用 Vue.js 開發的小夥伴們,你們都怎麼實作父子層組件資料的雙向綁定呢?如果你還在寫 prop + emit 的話,不妨進來看看吧。
Thumbnail
一般在使用 TypeScript 的時候,大家都有遇過定義列舉資料的情境吧。 不過不管是 enum 和 literal 的方式其實都有些小缺點,以下推薦一個個人認為體驗更好的方式。
Thumbnail
在 TypeScript 中,套件是模組化代碼的集合,可以提高代碼的可重用性和可維護性。常見的套件包括各種庫和框架,如 lodash、express 等。以下是有關引用套件、自定義套件和常見套件的詳細介紹。
Thumbnail
本章節旨在介紹 TypeScript 的基本資料型別,包括內建型別、型別轉換、自訂型別、元組、集合、陣列、和字典型別。透過理解和使用這些型別,可以提高代碼的可讀性和可維護性。
Thumbnail
本章節將引導你如何建立一個TypeScript開發環境,這包括安裝Node.js、npm和TypeScript,建立一個TypeScript項目,設置編輯器,以及編寫和編譯TypeScript代碼。在完成這些步驟之後,你將能夠編寫、編譯和運行TypeScript代碼。
Thumbnail
本章節旨在介紹TypeScript的基本語法,包括一般結構、程式進入點、註解以及變數的定義和賦值。這些知識將幫助讀者瞭解TypeScript的基本架構,並且可以開始使用TypeScript進行開發。
Thumbnail
TypeScript是一種由Microsoft開發和維護的開源編程語言。它是JavaScript的超集,主要擴展了JavaScript的語法,增加了靜態類型檢查和其他特性,使得開發大型應用程序更為方便和可靠。
Thumbnail
因為最近想嘗試編碼風格,於是就選了一套比較"不嚴格"的輔助工具來摸索。 編輯器 VS CODE 框架 VUE3 打包工具 VITE 編碼風格 Standard 環境 version { "nodejs":"v18.18.0", "npm":"9.8.1" }
Thumbnail
平常我們在 html 上常看到的例如 v-for、v-model 等等... 也是VUE已經幫我們定義好的指令,而這次我們可以依這自己的需求來建立。 此功能屬於較進階的功能,因此實戰中會比較少見,市面上還是有不少完善的套件能達到同樣效果,建議可以先往這方面察找