詳解TypeScript使用及類型聲明文件
簡(jiǎn)介
聲明文件是以.d.ts為后綴的文件,開(kāi)發(fā)者在聲明文件中編寫類型聲明,TypeScript根據(jù)聲明文件的內(nèi)容進(jìn)行類型檢查。(注意同目錄下最好不要有同名的.ts文件和.d.ts,例如lib.ts和lib.d.ts,否則模塊系統(tǒng)無(wú)法只根據(jù)文件名加載模塊)
為什么需要聲明文件呢?我們知道TypeScript根據(jù)類型聲明進(jìn)行類型檢查,但有些情況可能沒(méi)有類型聲明:
- 第三方包,因?yàn)榈谌桨虬蠖际荍avaScript語(yǔ)法,而非TypeScript,沒(méi)有類型。
- 宿主環(huán)境擴(kuò)展,如一些hybrid環(huán)境,在window變量下有一些bridge接口,這些接口沒(méi)有類型聲明。
Script 與 Vue3
參考鏈接(英文):vuejs.org/guide/types…
參考鏈接(中文):staging-cn.vuejs.org/guide/types…
vue3配合ts中,還需要額外安裝一個(gè) vscode 插件:Typescript Vue Plugin

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

