自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

重新認識Typescript | Vue3源碼系列

開發(fā) 前端
本篇文章作為 Vue3 源碼系列前置篇章之一,Typescript 的科普文,主要目的為了大家在面對 Vue3 源碼時不會顯得那么不知所措,下來將介紹一些 Typescript 的基本使用。

[[342445]]

初次見面

官方對其只用了一句話來描述

TypeScript is a typed superset of JavaScript that compiles to plain JavaScript. Any browser. Any host. Any OS. Open source.

大致意思為,TypeScript 是開源的,TypeScript 是 JavaScript 的類型的超集,它可以編譯成純 JavaScript。編譯出來的 JavaScript 可以運行在任何瀏覽器上。TypeScript 編譯工具可以運行在任何服務(wù)器和任何系統(tǒng)上

  • 問題: 什么是超集

超集是集合論的術(shù)語

說到超集,不得不說另一個,子集,怎么理解這兩個概念呢,舉個例子

如果一個集合A里面的的所有元素集合B里面都存在,那么我們可以理解集合A是集合B的子集,反之集合B為集合A的超集

現(xiàn)在我們就能理解為 Typescript 里包含了 Javascript 的所有特性,這也意味著我們可以將.js后綴直接命名為.ts文件跑到TypeScript的編繹系統(tǒng)中

Typescript 解決了什么問題

一個事物的誕生一定會有其存在的價值

那么 Typescript 的價值是什么呢?

回答這個問題之前,我們有必要先來了解一下 Typescript 的工作理念

本質(zhì)上是在 JavaScript 上增加一套靜態(tài)類型系統(tǒng)(編譯時進行類型分析),強調(diào)靜態(tài)類型系統(tǒng)是為了和運行時的類型檢查機制做區(qū)分,TypeScript 的代碼最終會被編譯為 JavaScript

我們再回到問題本身,縮小一下范圍,Typescript 創(chuàng)造的價值大部分是在開發(fā)時體現(xiàn)的(編譯時),而非運行時,如

  • 強大的編輯器智能提示 (研發(fā)效率,開發(fā)體驗)
  • 代碼可讀性增強 (團隊協(xié)作,開發(fā)體驗)
  • 編譯時類型檢查 (業(yè)務(wù)穩(wěn)健,前端項目中Top10 的錯誤類型低級的類型錯誤占比達到70%)

正文

本篇文章作為 Vue3 源碼系列前置篇章之一,Typescript 的科普文,主要目的為了大家在面對 Vue3 源碼時不會顯得那么不知所措,下來將介紹一些 Typescript 的基本使用。

變量申明

基本類型

  1. let isDone: boolean = false 
  2. let num: number = 1 
  3. let str: string = 'vue3js.cn' 
  4. let arr: number[] = [1, 2, 3]  
  5. let arr2: Array<number> = [1, 2, 3] // 泛型數(shù)組 
  6. let obj: Object = {} 
  7. let u: undefined = undefined; 
  8. let n: null = null

類型補充

  • 枚舉 Enum

使用枚舉類型可以為一組數(shù)值賦予友好的名字

 

  1. enum LogLevel { 
  2.   info = 'info'
  3.   warn = 'warn'
  4.   error = 'error'
  • 元組 Tuple

允許數(shù)組各元素的類型不必相同。比如,你可以定義一對值分別為 string和number類型的元組

  1. // Declare a tuple type 
  2. let x: [string, number]; 
  3. // Initialize it 
  4. x = ['hello', 10]; // OK 
  5. // Initialize it incorrectly 
  6. x = [10, 'hello']; // Error 
  • 任意值 Any

表示任意類型,通常用于不確定內(nèi)容的類型,比如來自用戶輸入或第三方代碼庫

 

  1. let notSure: any = 4; 
  2. notSure = "maybe a string instead"
  3. notSure = false; // okay, definitely a boolean 
  • 空值 Void

與 any 相反,通常用于函數(shù),表示沒有返回值

 

  1. function warnUser(): void { 
  2.     console.log("This is my warning message"); 
  • 接口 interface

類型契約,跟我們平常調(diào)服務(wù)端接口要先定義字段一個理

如下例子 point 跟 Point 類型必須一致,多一個少一個也是不被允許的

 

  1. interface Point { 
  2.     x: number 
  3.     y: number 
  4.     z?: number 
  5.     readonly l: number 
  6. const point: Point = { x: 10, y: 20, z: 30, l: 40 } 
  7. const point2: Point = { x: '10', y: 20, z: 30, l: 40 } // Error  
  8. const point3: Point = { x: 10, y: 20, z: 30 } // Error  
  9. const point4: Point = { x: 10, y: 20, z: 30, l: 40, m: 50 } // Error  

可選與只讀 ? 表示可選參, readonly 表示只讀

 

  1. const point5: Point = { x: 10, y: 20, l: 40 } // 正常 
  2. point5.l = 50 // error 

函數(shù)參數(shù)類型與返回值類型

 

  1. function sum(a: number, b: number): number { 
  2.     return a + b 

配合 interface 使用

 

  1. interface Point { 
  2.     x: number 
  3.     y: number 
  4.  
  5. function sum({ x,  y}: Point): number { 
  6.     return x + y 
  7.  
  8. sum({x:1, y:2}) // 3 

泛型

泛型的意義在于函數(shù)的重用性,設(shè)計原則希望組件不僅能夠支持當前的數(shù)據(jù)類型,同時也能支持未來的數(shù)據(jù)類型

  • 比如

根據(jù)業(yè)務(wù)最初的設(shè)計函數(shù) identity 入?yún)镾tring

  1. function identity(arg: String){ 
  2.  return arg 
  3. console.log(identity('100')) 

業(yè)務(wù)迭代過程參數(shù)需要支持 Number

 

  1. function identity(arg: String){ 
  2.  return arg 
  3. console.log(identity(100)) // Argument of type '100' is not assignable to parameter of type 'String'

為什么不用any呢?

使用 any 會丟失掉一些信息,我們無法確定返回值是什么類型

泛型可以保證入?yún)⒏祷刂凳窍嗤愋偷模且环N特殊的變量,只用于表示類型而不是值

語法 (arg:T):T 其中T為自定義變量

  1. const hello : string = "Hello vue!" 
  2. function say<T>(arg: T): T { 
  3.     return arg; 
  4. console.log(say(hello)) // Hello vue!  

泛型約束

我們使用同樣的例子,加了一個console,但是很不幸運,報錯了,因為泛型無法保證每種類型都有.length 屬性

  1. const hello : string = "Hello vue!" 
  2. function say<T>(arg: T): T { 
  3.  console.log(arg.length) // Property 'length' does not exist on type 'T'
  4.     return arg; 
  5. console.log(say(hello)) // Hello vue!  

從這里我們也又看出來一個跟any不同的地方,如果我們想要在約束層面上就結(jié)束戰(zhàn)斗,我們需要定義一個接口來描述約束條件

  1. interface Lengthwise { 
  2.     length: number; 
  3.  
  4. function say<T extends Lengthwise>(arg: T): T { 
  5.  console.log(arg.length) 
  6.     return arg; 
  7. console.log(say(1))  // Argument of type '1' is not assignable to parameter of type 'Lengthwise'
  8. console.log(say({value: 'hello vue!', length: 10})) // { value: 'hello vue!', length: 10 }  

交叉類型

交叉類型(Intersection Types),將多個類型合并為一個類型

  1. interface foo { 
  2.     x: number 
  3. interface bar { 
  4.     b: number 
  5. type intersection = foo & bar 
  6. const result: intersection = { 
  7.     x: 10, 
  8.     b: 20 
  9. const result1: intersection = { 
  10.     x: 10 
  11. }  // error 

聯(lián)合類型

交叉類型(Union Types),表示一個值可以是幾種類型之一。我們用豎線 | 分隔每個類型,所以 number | string | boolean表示一個值可以是 number, string,或 boolean

  1. type arg = string | number | boolean 
  2. const foo = (arg: arg):any =>{  
  3.     console.log(arg) 
  4. foo(1) 
  5. foo('2'
  6. foo(true

函數(shù)重載

函數(shù)重載(Function Overloading), 允許創(chuàng)建數(shù)項名稱相同但輸入輸出類型或個數(shù)不同的子程序,可以簡單理解為一個函數(shù)可以執(zhí)行多項任務(wù)的能力

例我們有一個add函數(shù),它可以接收string類型的參數(shù)進行拼接,也可以接收number類型的參數(shù)進行相加

  1. function add (arg1: string, arg2: string): string 
  2. function add (arg1: number, arg2: number): number 
  3.  
  4. // 實現(xiàn) 
  5. function add <T,U>(arg1: T, arg2: U) { 
  6.   // 在實現(xiàn)上我們要注意嚴格判斷兩個參數(shù)的類型是否相等,而不能簡單的寫一個 arg1 + arg2 
  7.   if (typeof arg1 === 'string' && typeof arg2 === 'string') { 
  8.     return arg1 + arg2 
  9.   } else if (typeof arg1 === 'number' && typeof arg2 === 'number') { 
  10.     return arg1 + arg2 
  11.   } 
  12.  
  13. add(1, 2) // 3 
  14. add('1','2') //'12' 

總結(jié)

通過本篇文章,相信大家對Typescript不會再感到陌生了

下面我們來看看在Vue源碼Typescript是如何書寫的,這里我們以defineComponent函數(shù)為例,大家可以通過這個實例,再結(jié)合文章的內(nèi)容,去理解,加深Typescript的認識

  1. // overload 1: direct setup function 
  2. export function defineComponent<Props, RawBindings = object>( 
  3.   setup: ( 
  4.     props: Readonly<Props>, 
  5.     ctx: SetupContext 
  6.   ) => RawBindings | RenderFunction 
  7. ): { 
  8.   new (): ComponentPublicInstance< 
  9.     Props, 
  10.     RawBindings, 
  11.     {}, 
  12.     {}, 
  13.     {}, 
  14.     // public props 
  15.     VNodeProps & Props 
  16.   > 
  17. } & FunctionalComponent<Props> 
  18.  
  19. // defineComponent一共有四個重載,這里省略三個 
  20.  
  21. // implementation, close to no-op 
  22. export function defineComponent(options: unknown) { 
  23.   return isFunction(options) ? { setup: options } : options 

 

 

責(zé)任編輯:龐桂玉 來源: 前端大全
相關(guān)推薦

2016-12-13 15:41:40

JavaHashMap

2014-01-06 11:23:54

Mesos設(shè)計架構(gòu)

2021-04-22 21:15:38

Generator函數(shù)生成器

2021-05-26 10:40:28

Vue3TypeScript前端

2019-02-24 21:27:26

物聯(lián)網(wǎng)網(wǎng)關(guān)物聯(lián)網(wǎng)IOT

2019-10-31 13:40:52

JavaPHP編程語言

2016-11-07 11:34:28

數(shù)據(jù)可視化大數(shù)據(jù)

2019-09-02 08:53:46

程序員

2021-11-11 05:00:02

JavaMmap內(nèi)存

2021-09-22 07:57:23

Vue3 插件Vue應(yīng)用

2017-01-03 17:22:16

公共云安全

2021-11-26 05:59:31

Vue3 插件Vue應(yīng)用

2015-03-19 10:15:54

程序員價值程序員價值

2022-10-09 11:46:55

機器人人工智能

2019-04-15 14:32:11

2012-01-11 09:12:25

程序員

2009-11-26 16:57:09

Cisco路由器ARP

2010-10-22 11:10:24

軟考

2019-01-18 13:32:16

2010-02-25 09:57:35

點贊
收藏

51CTO技術(shù)棧公眾號