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

面試官:說(shuō)說(shuō)你對(duì) TypeScript 中高級(jí)類型的理解?有哪些?

開(kāi)發(fā) 前端
除了string、number、boolean 這種基礎(chǔ)類型外,在 typescript 類型聲明中還存在一些高級(jí)的類型應(yīng)用。

[[422806]]

本文轉(zhuǎn)載自微信公眾號(hào)「JS每日一題」,作者 灰灰。轉(zhuǎn)載本文請(qǐng)聯(lián)系JS每日一題公眾號(hào)。

一、是什么

除了string、number、boolean 這種基礎(chǔ)類型外,在 typescript 類型聲明中還存在一些高級(jí)的類型應(yīng)用

這些高級(jí)類型,是typescript為了保證語(yǔ)言的靈活性,所使用的一些語(yǔ)言特性。這些特性有助于我們應(yīng)對(duì)復(fù)雜多變的開(kāi)發(fā)場(chǎng)景

二、有哪些

常見(jiàn)的高級(jí)類型有如下:

  • 交叉類型
  • 聯(lián)合類型
  • 類型別名
  • 類型索引
  • 類型約束
  • 映射類型
  • 條件類型

交叉類型

通過(guò) & 將多個(gè)類型合并為一個(gè)類型,包含了所需的所有類型的特性,本質(zhì)上是一種并的操作

語(yǔ)法如下:

  1. T & U 

適用于對(duì)象合并場(chǎng)景,如下將聲明一個(gè)函數(shù),將兩個(gè)對(duì)象合并成一個(gè)對(duì)象并返回:

  1. function extend<T , U>(first: T, second: U) : T & U { 
  2.     let result: <T & U> = {} 
  3.     for (let key in first) { 
  4.         result[key] = first[key
  5.     } 
  6.     for (let key in second) { 
  7.         if(!result.hasOwnProperty(key)) { 
  8.             result[key] = second[key
  9.         } 
  10.     } 
  11.     return result 

聯(lián)合類型

聯(lián)合類型的語(yǔ)法規(guī)則和邏輯 “或” 的符號(hào)一致,表示其類型為連接的多個(gè)類型中的任意一個(gè),本質(zhì)上是一個(gè)交的關(guān)系

語(yǔ)法如下:

  1. T | U 

例如 number | string | boolean 的類型只能是這三個(gè)的一種,不能共存

如下所示:

  1. function formatCommandline(command: string[] | string) { 
  2.   let line = ''
  3.   if (typeof command === 'string') { 
  4.     line = command.trim(); 
  5.   } else { 
  6.     line = command.join(' ').trim(); 
  7.   } 

類型別名

類型別名會(huì)給一個(gè)類型起個(gè)新名字,類型別名有時(shí)和接口很像,但是可以作用于原始值、聯(lián)合類型、元組以及其它任何你需要手寫的類型

可以使用 type SomeName = someValidTypeAnnotation的語(yǔ)法來(lái)創(chuàng)建類型別名:

  1. type some = boolean | string 
  2.  
  3. const b: some = true // ok 
  4. const c: some = 'hello' // ok 
  5. const d: some = 123 // 不能將類型“123”分配給類型“some” 

此外類型別名可以是泛型:

  1. type Container<T> = { value: T }; 

也可以使用類型別名來(lái)在屬性里引用自己:

  1. type Tree<T> = { 
  2.     value: T; 
  3.     left: Tree<T>; 
  4.     right: Tree<T>; 

可以看到,類型別名和接口使用十分相似,都可以描述一個(gè)對(duì)象或者函數(shù)

兩者最大的區(qū)別在于,interface只能用于定義對(duì)象類型,而 type 的聲明方式除了對(duì)象之外還可以定義交叉、聯(lián)合、原始類型等,類型聲明的方式適用范圍顯然更加廣泛

類型索引

keyof 類似于 Object.keys ,用于獲取一個(gè)接口中 Key 的聯(lián)合類型。

  1. interface Button { 
  2.     type: string 
  3.     text: string 
  4.  
  5. type ButtonKeys = keyof Button 
  6. // 等效于 
  7. type ButtonKeys = "type" | "text" 

類型約束

通過(guò)關(guān)鍵字 extend 進(jìn)行約束,不同于在 class 后使用 extends 的繼承作用,泛型內(nèi)使用的主要作用是對(duì)泛型加以約束

  1. type BaseType = string | number | boolean 
  2.  
  3. // 這里表示 copy 的參數(shù) 
  4. // 只能是字符串、數(shù)字、布爾這幾種基礎(chǔ)類型 
  5. function copy<T extends BaseType>(arg: T): T { 
  6.   return arg 

類型約束通常和類型索引一起使用,例如我們有一個(gè)方法專門用來(lái)獲取對(duì)象的值,但是這個(gè)對(duì)象并不確定,我們就可以使用 extends 和 keyof 進(jìn)行約束。

  1. function getValue<T, K extends keyof T>(obj: T, key: K) { 
  2.   return obj[key
  3.  
  4. const obj = { a: 1 } 
  5. const a = getValue(obj, 'a'

映射類型

通過(guò) in 關(guān)鍵字做類型的映射,遍歷已有接口的 key 或者是遍歷聯(lián)合類型,如下例子:

  1. type Readonly<T> = { 
  2.     readonly [P in keyof T]: T[P]; 
  3. }; 
  4.  
  5. interface Obj { 
  6.   a: string 
  7.   b: string 
  8.  
  9. type ReadOnlyObj = Readonly<Obj> 

上述的結(jié)構(gòu),可以分成這些步驟:

  • keyof T:通過(guò)類型索引 keyof 的得到聯(lián)合類型 'a' | 'b'
  • P in keyof T 等同于 p in 'a' | 'b',相當(dāng)于執(zhí)行了一次 forEach 的邏輯,遍歷 'a' | 'b'

所以最終ReadOnlyObj的接口為下述:

  1. interface ReadOnlyObj { 
  2.     readonly a: string; 
  3.     readonly b: string; 

條件類型

條件類型的語(yǔ)法規(guī)則和三元表達(dá)式一致,經(jīng)常用于一些類型不確定的情況。

  1. T extends U ? X : Y 

上面的意思就是,如果 T 是 U 的子集,就是類型 X,否則為類型 Y

三、總結(jié)

可以看到,如果只是掌握了 typeScript 的一些基礎(chǔ)類型,可能很難游刃有余的去使用 typeScript,需要了解一些typescript的高階用法,在實(shí)踐場(chǎng)景中,還有更多更復(fù)雜的組合,需要在實(shí)踐中慢慢體會(huì)

參考文獻(xiàn)

https://www.tslang.cn/docs/handbook/advanced-types.html

https://juejin.cn/post/6844904003604578312

 

https://zhuanlan.zhihu.com/p/103846208

 

責(zé)任編輯:武曉燕 來(lái)源: JS每日一題
相關(guān)推薦

2021-09-26 10:57:16

集合操作場(chǎng)景

2021-11-25 10:18:42

RESTfulJava互聯(lián)網(wǎng)

2021-09-27 06:50:04

非線性數(shù)據(jù)

2021-08-09 07:47:40

Git面試版本

2020-12-01 08:47:36

Java異常開(kāi)發(fā)

2020-06-12 15:50:56

options前端服務(wù)器

2021-08-20 08:33:19

操作系統(tǒng)OS

2021-09-06 10:51:27

TypeScriptJavaScript

2021-09-10 06:50:03

TypeScript裝飾器應(yīng)用

2021-09-08 07:49:34

TypeScript 泛型場(chǎng)景

2021-09-07 08:33:27

JavaScript TypeScript 函數(shù)

2021-09-16 07:52:18

算法應(yīng)用場(chǎng)景

2019-05-10 10:50:04

Spring AOPJDK動(dòng)態(tài)代理CGLIB動(dòng)態(tài)代理

2021-11-09 08:51:13

模式命令面試

2020-12-04 06:27:04

序列化面試官Java

2021-11-05 07:47:56

代理模式對(duì)象

2024-07-26 08:10:10

2021-11-03 14:10:28

工廠模式場(chǎng)景

2021-11-02 22:04:58

模式

2021-11-10 07:47:49

組合模式場(chǎng)景
點(diǎn)贊
收藏

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