欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解TypeScript使用及類型聲明文件

 更新時間:2022年06月07日 10:18:40   作者:壹個切圖仔  
聲明文件是以.d.ts為后綴的文件,開發(fā)者在聲明文件中編寫類型聲明,TypeScript根據(jù)聲明文件的內(nèi)容進行類型檢查,這篇文章主要介紹了TypeScript使用及類型聲明文件的相關(guān)知識,需要的朋友可以參考下

簡介

聲明文件是以.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>

如果提供的默認值需要在模板中渲染,需要額外添加配置

vuejs.org/guide/extra…

// 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)框的屬性實例詳解

    這篇文章主要介紹了bootstrap中模態(tài)框、模態(tài)框的屬性實例詳解,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-02-02
  • javascript 構(gòu)建模塊化開發(fā)過程解析

    javascript 構(gòu)建模塊化開發(fā)過程解析

    這篇文章主要介紹了javascript 構(gòu)建模塊化開發(fā)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09
  • webpack打包中path.resolve(__dirname, 'dist')的含義解析

    webpack打包中path.resolve(__dirname, 'dist')的含義解

    這篇文章主要介紹了webpack打包中path.resolve(__dirname, 'dist')的含義解析,path:path.resolve(__dirname, 'dist')就是在打包之后的文件夾上拼接了一個文件夾,在打包時,直接生成,本文給大家講解的非常詳細,需要的朋友可以參考下
    2023-05-05
  • JavaScript異步調(diào)用定時方法并停止該方法實現(xiàn)代碼

    JavaScript異步調(diào)用定時方法并停止該方法實現(xiàn)代碼

    JavaScript異步調(diào)用定時方法并停止該方法實現(xiàn)代碼 ,需要的朋友可以參考下
    2012-03-03
  • JavaScript 十六進制RGB色碼轉(zhuǎn)換器

    JavaScript 十六進制RGB色碼轉(zhuǎn)換器

    JavaScript 十六進制RGB色碼轉(zhuǎn)換器,大家可以學習下思路。
    2009-08-08
  • 項目中常用的JS方法整理

    項目中常用的JS方法整理

    這里給大家整理的是本人上個項目中所用到的js方法,都是些非常常用的javascript方法,相信小伙伴們也能經(jīng)常用到,這里整理出來分享給大家。
    2015-01-01
  • javascript中字符串處理常用的方法匯總

    javascript中字符串處理常用的方法匯總

    JavaScript中操作字符串是一個很重要的話題,下面這篇文章主要給大家介紹了關(guān)于javascript中字符串處理常用的方法,文中通過圖文以及代碼示例介紹的非常詳細,需要的朋友可以參考下
    2024-03-03
  • 基于JS實現(xiàn)省市聯(lián)動效果代碼分享

    基于JS實現(xiàn)省市聯(lián)動效果代碼分享

    這篇文章主要介紹了基于JS實現(xiàn)省市聯(lián)動效果代碼的相關(guān)資料,非常實用,在日常項目開發(fā)過程中經(jīng)常遇到此需求,下面小編給大家分享實現(xiàn)代碼,需要的朋友可以參考下
    2016-06-06
  • JavaScript canvas實現(xiàn)鏡像圖片效果

    JavaScript canvas實現(xiàn)鏡像圖片效果

    這篇文章主要為大家詳細介紹了JavaScript canvas實現(xiàn)鏡像圖片效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • JavaScript簡寫技巧

    JavaScript簡寫技巧

    這篇文章主要介紹了JavaScript簡寫技巧,運用簡寫技巧,可以加快開發(fā)速度,讓開發(fā)工作事半功倍,大家感興趣的話可以參考本篇文章
    2021-08-08

最新評論