日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
重新認(rèn)識(shí)Typescript|Vue3源碼系列

初次見(jiàn)面

官方對(duì)其只用了一句話來(lái)描述

創(chuàng)新互聯(lián)主營(yíng)阿爾山網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,APP應(yīng)用開(kāi)發(fā),阿爾山h5成都小程序開(kāi)發(fā)搭建,阿爾山網(wǎng)站營(yíng)銷推廣歡迎阿爾山等地區(qū)企業(yè)咨詢

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

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

  • 問(wèn)題: 什么是超集

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

說(shuō)到超集,不得不說(shuō)另一個(gè),子集,怎么理解這兩個(gè)概念呢,舉個(gè)例子

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

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

Typescript 解決了什么問(wèn)題

一個(gè)事物的誕生一定會(huì)有其存在的價(jià)值

那么 Typescript 的價(jià)值是什么呢?

回答這個(gè)問(wèn)題之前,我們有必要先來(lái)了解一下 Typescript 的工作理念

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

我們?cè)倩氐絾?wèn)題本身,縮小一下范圍,Typescript 創(chuàng)造的價(jià)值大部分是在開(kāi)發(fā)時(shí)體現(xiàn)的(編譯時(shí)),而非運(yùn)行時(shí),如

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

正文

本篇文章作為 Vue3 源碼系列前置篇章之一,Typescript 的科普文,主要目的為了大家在面對(duì) Vue3 源碼時(shí)不會(huì)顯得那么不知所措,下來(lái)將介紹一些 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 = [1, 2, 3] // 泛型數(shù)組
  6. let obj: Object = {}
  7. let u: undefined = undefined;
  8. let n: null = null;

類型補(bǔ)充

  • 枚舉 Enum

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

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

允許數(shù)組各元素的類型不必相同。比如,你可以定義一對(duì)值分別為 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)容的類型,比如來(lái)自用戶輸入或第三方代碼庫(kù)

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

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

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

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

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

 
 
 
  1. interface Point {
  2.     x: number
  3.     y: number
  4.     z?: number
  5.     readonly l: number
  6. }
  7. const point: Point = { x: 10, y: 20, z: 30, l: 40 }
  8. const point2: Point = { x: '10', y: 20, z: 30, l: 40 } // Error 
  9. const point3: Point = { x: 10, y: 20, z: 30 } // Error 
  10. 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
  3. }

配合 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è)計(jì)原則希望組件不僅能夠支持當(dāng)前的數(shù)據(jù)類型,同時(shí)也能支持未來(lái)的數(shù)據(jù)類型

  • 比如

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

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

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

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

為什么不用any呢?

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

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

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

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

泛型約束

我們使用同樣的例子,加了一個(gè)console,但是很不幸運(yùn),報(bào)錯(cuò)了,因?yàn)榉盒蜔o(wú)法保證每種類型都有.length 屬性

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

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

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

交叉類型

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

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

聯(lián)合類型

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

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

函數(shù)重載

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

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

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

總結(jié)

通過(guò)本篇文章,相信大家對(duì)Typescript不會(huì)再感到陌生了

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

 
 
 
  1. // overload 1: direct setup function
  2. export function defineComponent(
  3.   setup: (
  4.     props: Readonly,
  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
  18. // defineComponent一共有四個(gè)重載,這里省略三個(gè)
  19. // implementation, close to no-op
  20. export function defineComponent(options: unknown) {
  21.   return isFunction(options) ? { setup: options } : options
  22. }

名稱欄目:重新認(rèn)識(shí)Typescript|Vue3源碼系列
本文地址:http://m.5511xx.com/article/ccchpso.html