詳解TypeScript使用及類型聲明文件
簡介
聲明文件是以.d.ts為后綴的文件,開發(fā)者在聲明文件中編寫類型聲明,TypeScript根據(jù)聲明文件的內(nèi)容進行類型檢查。(注意同目錄下最好不要有同名的.ts文件和.d.ts,例如lib.ts和lib.d.ts,否則模塊系統(tǒng)無法只根據(jù)文件名加載模塊)
為什么需要聲明文件呢?我們知道TypeScript根據(jù)類型聲明進行類型檢查,但有些情況可能沒有類型聲明:
- 第三方包,因為第三方包打包后都是JavaScript語法,而非TypeScript,沒有類型。
- 宿主環(huán)境擴展,如一些hybrid環(huán)境,在window變量下有一些bridge接口,這些接口沒有類型聲明。
Script 與 Vue3
參考鏈接(英文):vuejs.org/guide/types…
參考鏈接(中文):staging-cn.vuejs.org/guide/types…
vue3配合ts中,還需要額外安裝一個 vscode 插件:Typescript Vue Plugin
defineProps 與 Typescript
目標:掌握defineProps如何配合ts使用
- defineProps配合vue默認語法進行類型校驗(運行時聲明)
// 運行時聲明 defineProps({ money: { type: Number, required: true }, car: { type: String, required: true } })
- defineProps配合ts的泛型定義props類型校驗,這樣更直接
// 使用 ts 的泛型指定 props 類型 defineProps<{ money: number car?: string }>()
- props 可以通過解構(gòu)來指定默認值
<script lang="ts" setup> // 使用ts的泛型指令props類型 const { money, car = '小黃車' } = defineProps<{ money: number car?: string }>() </script>
如果提供的默認值需要在模板中渲染,需要額外添加配置
// vite.config.js export default { plugins: [ vue({ reactivityTransform: true }) ] }
defineEmits 與 Typescript
目標:掌握 defineEmits 如何配合ts使用
- defineEmits 配合運行時聲明
const emit = defineEmits(['change', 'update'])
- defineEmits配合ts 類型聲明,可以實現(xiàn)更細粒度的校驗
const emit = defineEmits<{ (e: 'changeMoney', money: number): void (e: 'changeCar', car: string): void }>()
ref 與 Typescript
目標:掌握ref配合ts如何使用
- 通過泛型指定value的值類型,如果是簡單值,該類型可以省略
const money = ref<number>(10) // 推薦寫法,提供效率 const money = ref(10)
- 如果是復雜類型,泛型指定
interface Todo { id: number content: string done: boolean } // 復雜類型需要指定結(jié)構(gòu),不能省略 const list = ref<Todo[]>([]) list.value.push({ id: 1, content: '吃飯', done: false })
computed 與 Typescript
目標:掌握computed配合typescript如何使用
- 通過泛型可以指定computed計算屬性的類型,通??梢允÷?/li>
const leftCount = computed<number>(() => { return list.value.filter((v) => v.done).length }) console.log(leftCount.value)
事件對象 與 Typescript
目標:掌握事件處理函數(shù)配合typescript如何使用
const btn = (e: MouseEvent) => { mouse.value.x = e.pageX mouse.value.y = e.pageY } <h2 @click="btn($event)">根組件</h2>
模板 Ref 與 Typescript
目標:掌握ref操作DOM時如何配合Typescript使用
const imgRef = ref<HTMLImageElement | null>(null) onMounted(() => { console.log(imgRef.value?.src) })
如何查看一個DOM對象的類型:通過控制臺進行查看
document.createElement('img').__proto__
可選鏈操作符
**目標:**掌握js中的提供的可選鏈操作符語法
內(nèi)容
- 可選鏈操作符(
?.
)允許讀取位于連接對象鏈深處的屬性的值,而不必明確驗證鏈中的每個引用是否有效。 - 參考文檔:developer.mozilla.org/zh-CN/docs/…
let nestedProp = obj.first?.second; console.log(res.data?.data) obj.fn?.() if (obj.fn) { obj.fn() } obj.fn && obj.fn() // 等價于 let temp = obj.first; let nestedProp = ((temp === null || temp === undefined) ? undefined : temp.second);
非空斷言-TS
目標:掌握ts中的非空斷言的使用語法
內(nèi)容:
- 如果我們明確的知道對象的屬性一定不會為空,那么可以使用非空斷言
!
// 告訴 typescript, 明確的指定obj不可能為空 let nestedProp = obj!.second;
- 注意:非空斷言一定要確保有該屬性才能使用,不然使用非空斷言會導致bug
TypeScript類型聲明文件
基本介紹
今天幾乎所有的 JavaScript 應用都會引入許多第三方庫來完成任務需求。 這些第三方庫不管是否是用 TS 編寫的,最終都要編譯成 JS 代碼,才能發(fā)布給開發(fā)者使用。 我們知道是 TS 提供了類型,才有了代碼提示和類型保護等機制。
但在項目開發(fā)中使用第三方庫時,你會發(fā)現(xiàn)它們幾乎都有相應的 TS 類型,這些類型是怎么來的呢? 類型聲明文件
類型聲明文件:用來為已存在的 JS 庫提供類型信息
TS 中有兩種文件類型:1
.ts
文件 2.d.ts
文件.ts 文件:
既包含類型信息又可執(zhí)行代碼
可以被編譯為 .js 文件,然后,執(zhí)行代碼
用途:編寫程序代碼的地方
.d.ts 文件:
只包含類型信息
的類型聲明文件不會生成 .js 文件,僅用于提供類型信息,在.d.ts文件中不允許出現(xiàn)可執(zhí)行的代碼,只用于提供類型
用途:為 JS 提供類型信息
總結(jié):.ts 是
implementation
(代碼實現(xiàn)文件);.d.ts 是 declaration(類型聲明文件)如果要為 JS 庫提供類型信息,要使用
.d.ts
文件
內(nèi)置類型聲明文件
- TS 為 JS 運行時可用的所有標準化內(nèi)置 API 都提供了聲明文件
- 比如,在使用數(shù)組時,數(shù)組所有方法都會有相應的代碼提示以及類型信息:
const strs = ['a', 'b', 'c'] // 鼠標放在 forEach 上查看類型 strs.forEach
- 實際上這都是 TS 提供的內(nèi)置類型聲明文件
- 可以通過 Ctrl + 鼠標左鍵(Mac:Command + 鼠標左鍵)來查看內(nèi)置類型聲明文件內(nèi)容
- 比如,查看 forEach 方法的類型聲明,在 VSCode 中會自動跳轉(zhuǎn)到
lib.es5.d.ts
類型聲明文件中 - 當然,像 window、document 等 BOM、DOM API 也都有相應的類型聲明(
lib.dom.d.ts
)
第三方庫類型聲明文件
- 目前,幾乎所有常用的第三方庫都有相應的類型聲明文件
- 第三方庫的類型聲明文件有兩種存在形式:1 庫自帶類型聲明文件 2 由 DefinitelyTyped 提供。
- 庫自帶類型聲明文件:比如,axios
- 查看
node_modules/axios
目錄
解釋:這種情況下,正常導入該庫,TS 就會自動加載庫自己的類型聲明文件,以提供該庫的類型聲明。
- 由 DefinitelyTyped 提供
- DefinitelyTyped 是一個 github 倉庫,用來提供高質(zhì)量 TypeScript 類型聲明
- DefinitelyTyped 鏈接
- 可以通過 npm/yarn 來下載該倉庫提供的 TS 類型聲明包,這些包的名稱格式為:
@types/*
- 比如,@types/react、@types/lodash 等
- 說明:在實際項目開發(fā)時,如果你使用的第三方庫沒有自帶的聲明文件,VSCode 會給出明確的提示
import _ from 'lodash' // 在 VSCode 中,查看 'lodash' 前面的提示
- 解釋:當安裝
@types/*
類型聲明包后,TS 也會自動加載該類聲明包,以提供該庫的類型聲明 - 補充:TS 官方文檔提供了一個頁面,可以來查詢 @types/* 庫
- @types/* 庫
自定義類型聲明文件
項目內(nèi)共享類型
- 如果多個 .ts 文件中都用到同一個類型,此時可以創(chuàng)建 .d.ts 文件提供該類型,實現(xiàn)類型共享。
- 操作步驟:
創(chuàng)建 index.d.ts 類型聲明文件。
創(chuàng)建需要共享的類型,并使用 export 導出(TS 中的類型也可以使用 import/export 實現(xiàn)模塊化功能)。
在需要使用共享類型的 .ts 文件中,通過 import 導入即可(.d.ts 后綴導入時,直接省略)。
為已有 JS 文件提供類型聲明
- 在將 JS 項目遷移到 TS 項目時,為了讓已有的 .js 文件有類型聲明。
- 成為庫作者,創(chuàng)建庫給其他人使用。
- 演示:基于最新的 ESModule(import/export)來為已有 .js 文件,創(chuàng)建類型聲明文件。
類型聲明文件的使用說明
- 說明:TS 項目中也可以使用 .js 文件。
- 說明:在導入 .js 文件時,TS 會自動加載與 .js 同名的 .d.ts 文件,以提供類型聲明。
- declare 關(guān)鍵字:用于類型聲明,為其他地方(比如,.js 文件)已存在的變量聲明類型,而不是創(chuàng)建一個新的變量。
對于 type、interface 等這些明確就是 TS 類型的(只能在 TS 中使用的),可以省略 declare 關(guān)鍵字。
對于 let、function 等具有雙重含義(在 JS、TS 中都能用),應該使用 declare 關(guān)鍵字,明確指定此處用于類型聲明。
let count = 10 let songName = '癡心絕對' let position = { x: 0, y: 0 } function add(x, y) { return x + y } function changeDirection(direction) { console.log(direction) } const fomartPoint = point => { console.log('當前坐標:', point) } export { count, songName, position, add, changeDirection, fomartPoint }
定義類型聲明文件
declare let count:number declare let songName: string interface Position { x: number, y: number } declare let position: Position declare function add (x :number, y: number) : number type Direction = 'left' | 'right' | 'top' | 'bottom' declare function changeDirection (direction: Direction): void type FomartPoint = (point: Position) => void declare const fomartPoint: FomartPoint export { count, songName, position, add, changeDirection, FomartPoint, fomartPoint }
到此這篇關(guān)于TypeScript使用以及類型聲明文件的文章就介紹到這了,更多相關(guān)TypeScript使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
bootstrap中模態(tài)框、模態(tài)框的屬性實例詳解
這篇文章主要介紹了bootstrap中模態(tài)框、模態(tài)框的屬性實例詳解,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-02-02javascript 構(gòu)建模塊化開發(fā)過程解析
這篇文章主要介紹了javascript 構(gòu)建模塊化開發(fā)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-09-09webpack打包中path.resolve(__dirname, 'dist')的含義解
這篇文章主要介紹了webpack打包中path.resolve(__dirname, 'dist')的含義解析,path:path.resolve(__dirname, 'dist')就是在打包之后的文件夾上拼接了一個文件夾,在打包時,直接生成,本文給大家講解的非常詳細,需要的朋友可以參考下2023-05-05JavaScript異步調(diào)用定時方法并停止該方法實現(xiàn)代碼
JavaScript異步調(diào)用定時方法并停止該方法實現(xiàn)代碼 ,需要的朋友可以參考下2012-03-03JavaScript 十六進制RGB色碼轉(zhuǎn)換器
JavaScript 十六進制RGB色碼轉(zhuǎn)換器,大家可以學習下思路。2009-08-08JavaScript canvas實現(xiàn)鏡像圖片效果
這篇文章主要為大家詳細介紹了JavaScript canvas實現(xiàn)鏡像圖片效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08