国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

聊一聊Typescript 高級技巧

開發 前端
用了一段時間的 typescript 之后,深感中大型項目中 typescript 的必要性,它能夠提前在編譯期避免許多 bug,如很惡心的拼寫問題。而越來越多的 package 也開始使用 ts,學習 ts 已是勢在必行。

[[415260]]

用了一段時間的 typescript 之后,深感中大型項目中 typescript 的必要性,它能夠提前在編譯期避免許多 bug,如很惡心的拼寫問題。而越來越多的 package 也開始使用 ts,學習 ts 已是勢在必行。

以下是我在工作中總結到的比較實用的 typescript 技巧。

01 keyof

keyof 與 Object.keys 略有相似,只不過 keyof 取 interface 的鍵。

  1. interface Point { 
  2.     x: number; 
  3.     y: number; 
  4.  
  5. // type keys = "x" | "y" 
  6. type keys = keyof Point; 

假設有一個 object 如下所示,我們需要使用 typescript 實現一個 get 函數來獲取它的屬性值

  1. const data = { 
  2.   a: 3, 
  3.   hello: 'world' 
  4.  
  5. function get(o: object, name: string) { 
  6.   return o[name

我們剛開始可能會這么寫,不過它有很多缺點

  • 無法確認返回類型:這將損失 ts 最大的類型校驗功能
  • 無法對 key 做約束:可能會犯拼寫錯誤的問題

這時可以使用 keyof 來加強 get 函數的類型功能,有興趣的同學可以看看 _.get 的 type 標記以及實現

  1. function get<T extends object, K extends keyof T>(o: T, name: K): T[K] { 
  2.   return o[name

02 Required & Partial & Pick

既然了解了 keyof,可以使用它對屬性做一些擴展, 如實現 Partial 和 Pick,Pick 一般用在 _.pick 中

  1. type Partial<T> = { 
  2.   [P in keyof T]?: T[P]; 
  3. }; 
  4.  
  5. type Required<T> = { 
  6.   [P in keyof T]-?: T[P]; 
  7. }; 
  8.  
  9. type Pick<T, K extends keyof T> = { 
  10.   [P in K]: T[P]; 
  11. }; 
  12.  
  13. interface User { 
  14.   id: number; 
  15.   age: number; 
  16.   name: string; 
  17. }; 
  18.  
  19. // 相當于: type PartialUser = { id?: number; age?: number; name?: string; } 
  20. type PartialUser = Partial<User
  21.  
  22. // 相當于: type PickUser = { id: number; age: number; } 
  23. type PickUser = Pick<User"id" | "age"

這幾個類型已內置在 Typescript 中

03 Condition Type

類似于 js 中的 ?: 運算符,可以使用它擴展一些基本類型

  1. T extends U ? X : Y 
  2.  
  3. type isTrue<T> = T extends true ? true : false 
  4. // 相當于 type t = false 
  5. type t = isTrue<number> 
  6.  
  7. // 相當于 type t = false 
  8. type t1 = isTrue<false

04 never & Exclude & Omit

官方文檔對 never 的描述如下

the never type represents the type of values that never occur.

結合 never 與 conditional type 可以推出很多有意思而且實用的類型,比如 Omit

  1. type Exclude<T, U> = T extends U ? never : T; 
  2.  
  3. // 相當于: type A = 'a' 
  4. type A = Exclude<'x' | 'a''x' | 'y' | 'z'

結合 Exclude 可以推出 Omit 的寫法

  1. type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>; 
  2.  
  3. interface User { 
  4.   id: number; 
  5.   age: number; 
  6.   name: string; 
  7. }; 
  8.  
  9. // 相當于: type PickUser = { age: number; name: string; } 
  10. type OmitUser = Omit<User"id"

05 typeof

顧名思義,typeof 代表取某個值的 type,可以從以下示例來展示他們的用法

  1. const a: number = 3 
  2.  
  3. // 相當于: const b: number = 4 
  4. const b: typeof a = 4 

在一個典型的服務端項目中,我們經常需要把一些工具塞到 context 中,如config,logger,db models, utils 等,此時就使用到 typeof。

  1. import logger from './logger' 
  2. import utils from './utils' 
  3.  
  4. interface Context extends KoaContect { 
  5.   logger: typeof logger, 
  6.   utils: typeof utils 
  7.  
  8. app.use((ctx: Context) => { 
  9.   ctx.logger.info('hello, world'
  10.  
  11.   // 會報錯,因為 logger.ts 中沒有暴露此方法,可以最大限度的避免拼寫錯誤 
  12.   ctx.loger.info('hello, world'
  13. }) 

06 is

在此之前,先看一個 koa 的錯誤處理流程,以下是對 error 進行集中處理,并且標識 code 的過程

  1. app.use(async (ctx, next) => { 
  2.   try { 
  3.     await next(); 
  4.   } catch (err) { 
  5.     let code = 'BAD_REQUEST' 
  6.     if (err.isAxiosError) { 
  7.       code = `Axios-${err.code}` 
  8.     } else if (err instanceof Sequelize.BaseError) { 
  9.  
  10.     } 
  11.     ctx.body = { 
  12.       code 
  13.     } 
  14.   } 
  15. }) 

在 err.code 處,會編譯出錯,提示 Property 'code' does not exist on type 'Error'.ts(2339)。

此時可以使用 as AxiosError 或者 as any 來避免報錯,不過強制類型轉換也不夠友好

  1. if ((err as AxiosError).isAxiosError) { 
  2.   code = `Axios-${(err as AxiosError).code}` 

此時可以使用 is 來判定值的類型

  1. function isAxiosError (error: any): error is AxiosError { 
  2.   return error.isAxiosError 
  3.  
  4. if (isAxiosError(err)) { 
  5.   code = `Axios-${err.code}` 

在 GraphQL 的源碼中,有很多諸如此類的用法,用以標識類型

  1. export function isType(type: any): type is GraphQLType; 
  2.  
  3. export function isScalarType(type: any): type is GraphQLScalarType; 
  4.  
  5. export function isObjectType(type: any): type is GraphQLObjectType; 
  6.  
  7. export function isInterfaceType(type: any): type is GraphQLInterfaceType; 

07 interface & type

interface 與 type 的區別是什么?可以參考以下 stackoverflow 的問題

https://stackoverflow.com/questions/37233735/typescript-interfaces-vs-types

一般來說,interface 與 type 區別很小,比如以下兩種寫法差不多

  1. interface A { 
  2.   a: number; 
  3.   b: number; 
  4. }; 
  5.  
  6. type B = { 
  7.   a: number; 
  8.   b: number; 

其中 interface 可以如下合并多個,而 type 只能使用 & 類進行連接。

  1. interface A { 
  2.     a: number; 
  3.  
  4. interface A { 
  5.     b: number; 
  6.  
  7. const a: A = { 
  8.     a: 3, 
  9.     b: 4 

08 Record & Dictionary & Many

這幾個語法糖是從 lodash 的 types 源碼中學到的,平時工作中的使用頻率還挺高。

  1. type Record<K extends keyof any, T> = { 
  2.     [P in K]: T; 
  3. }; 
  4.  
  5. interface Dictionary<T> { 
  6.   [index: string]: T; 
  7. }; 
  8.  
  9. interface NumericDictionary<T> { 
  10.   [index: number]: T; 
  11. }; 
  12.  
  13. const data:Dictionary<number> = { 
  14.   a: 3, 
  15.   b: 4 

09 使用 const enum 維護常量表

相比使用字面量對象維護常量,const enum 可以提供更安全的類型檢查

  1. // 使用 object 維護常量 
  2. const TODO_STATUS { 
  3.   TODO: 'TODO'
  4.   DONE: 'DONE'
  5.   DOING: 'DOING' 
  1. // 使用 const enum 維護常量 
  2. const enum TODO_STATUS { 
  3.   TODO = 'TODO'
  4.   DONE = 'DONE'
  5.   DOING = 'DOING' 
  6.  
  7. function todos (status: TODO_STATUS): Todo[]; 
  8.  
  9. todos(TODO_STATUS.TODO) 

10 VS Code Tips & Typescript Command

使用 VS Code 有時會出現,使用 tsc 編譯時產生的問題與 vs code 提示的問題不一致

找到項目右下角的 Typescript 字樣,右側顯示它的版本號,可以點擊選擇 Use Workspace Version,它表示與項目依賴的 typescript 版本一直。

或者編輯 .vs-code/settings.json

  1.   "typescript.tsdk""node_modules/typescript/lib" 

11 Typescript Roadmap

最后一條也是最重要的一條,翻閱 Roadmap,了解 ts 的一些新的特性與 bug 修復情況。

參考

https://www.typescriptlang.org/docs/handbook/advanced-types.html

https://www.typescriptlang.org/docs/handbook/declaration-files/do-s-and-don-ts.html

https://moin.world/2017/06/18/10-typescript-features-you-might-not-know/

本文轉載自微信公眾號「全棧成長之路」,可以通過以下二維碼關注。轉載本文請聯系全棧成長之路公眾號。

 

責任編輯:武曉燕 來源: 全棧成長之路
相關推薦

2024-10-28 21:02:36

消息框應用程序

2022-09-19 16:24:33

數據可視化Matplotlib工具

2022-10-19 15:20:58

pandas數據處理庫技巧

2018-04-27 09:22:21

數據存儲技巧

2023-12-14 11:35:32

.NET泄露模式

2023-09-22 17:36:37

2020-05-22 08:16:07

PONGPONXG-PON

2021-01-28 22:31:33

分組密碼算法

2018-06-07 13:17:12

契約測試單元測試API測試

2024-07-24 11:40:33

2022-11-01 08:46:20

責任鏈模式對象

2019-02-13 14:15:59

Linux版本Fedora

2021-01-29 08:32:21

數據結構數組

2023-07-06 13:56:14

微軟Skype

2023-05-15 08:38:58

模板方法模式

2018-11-29 09:13:47

CPU中斷控制器

2020-10-15 06:56:51

MySQL排序

2022-08-08 08:25:21

Javajar 文件

2021-02-06 08:34:49

函數memoize文檔

2020-08-12 08:34:16

開發安全We
點贊
收藏

51CTO技術棧公眾號

日韩电影一区| 久久国产精品久久久久久| 欧美精品videosex牲欧美| 18视频免费网址在线观看| 激情综合色综合久久| 国产制服丝袜一区| 午夜日韩在线电影| 超碰在线97免费| 久久99免费视频| 欧美精品激情blacked18| 国产永久免费高清在线观看视频| 久久日韩粉嫩一区二区三区 | 久久久中文字幕| a视频在线看| 中文字幕综合网| 中文字幕网av| 成人免费毛片aaaaa**| 日韩高清三级| 国模吧视频一区| 国产69精品久久久久9| 精品国产一区二区三区性色av| 91精品免费在线| 九色视频在线播放| 色婷婷亚洲精品| 2024最新电影在线免费观看| av在线不卡电影| 性欧美极品xxxx欧美一区二区| www.欧美.com| 国产无遮挡在线视频免费观看| 亚洲免费观看高清在线观看| 污污免费网站| 亚洲午夜影视影院在线观看| 久热av在线| 国产精品久久久久久久蜜臀| 国产综合中文字幕| www视频在线免费观看| 91精品国产调教在线观看| 国产在线视频91| 亚洲欧美日韩视频二区| 久久这里只有精品8| 国产三级欧美三级日产三级99| 国产1区2区3区| 午夜国产精品一区| 在线观看黄色片| 午夜网站在线观看| 99视频国产精品| 国产一区免费在线| 夜色77av精品影院| 日韩美女在线观看| 久久久蜜桃一区二区人| 精品久久蜜桃| 亚洲成人av在线电影| 毛片无码国产| 欧美日韩在线免费观看| 东京热加勒比无码少妇| 国产成人在线网站| 精品成在人线av无码免费看| 国产日韩精品一区二区浪潮av | 26uuu久久天堂性欧美| 97在线资源在| 欧美三级日韩在线| 久久看人人摘| 美腿丝袜亚洲图片| 久久精品五月婷婷| 国内精品视频666| 国内三级在线观看| 伊人男人综合视频网| 欧美日韩一区自拍 | 久久99国产精品久久99大师| 国外成人在线直播| 日韩欧美综合| 日本一区免费| 99精品视频在线观看免费| 一区二区三区 日韩| 亚洲色图一区二区| 黑人与亚洲人色ⅹvideos| 日韩一区二区三区av| 在线看国产一区二区| yellow中文字幕久久| 日韩av综合| 国产精品久久视频| 久久成人精品| 久久精品香蕉视频| 日本乱码高清不卡字幕| 黄色在线网站噜噜噜| 97香蕉超级碰碰久久免费的优势| 牛牛国产精品| 日韩人妻无码精品久久久不卡| 国产精品私人影院| 在线观看免费黄色| 日韩在线视频免费观看高清中文| 欧洲福利电影| 九九久久99| av网站免费线看精品| 在线播放的av| 一本色道久久88亚洲综合88| 99精品美女| 99在线精品免费视频| 欧美日韩在线另类| 亚洲成人1区| 国产成人成网站在线播放青青| 国产一区二区三区精品视频| 久草在线在线| 综合国产在线观看| 国产精品sm| 污片在线免费看| 日韩视频在线观看一区二区| 澳门成人av| 亚洲激情免费视频| 欧美揉bbbbb揉bbbbb| 国产精品高潮呻吟久久久久| 日韩在线电影一区| 午夜精品久久久久影视| 成人黄色在线| 欧美精品一区二区三区在线四季| 中文字幕亚洲一区二区va在线| 美女高潮视频在线看| 亚洲综合在线播放| 国产欧美精品一区二区三区四区| 日本高清成人vr专区| 国产精品pans私拍| 久久婷婷国产综合国色天香| 日韩脚交footjobhd| 精品一区二区不卡| 亚洲一级在线观看| 丁香5月婷婷久久| 欧美视频在线观看网站 | 激情综合在线观看| 精品日韩av一区二区| 欧美.日韩.国产.一区.二区| 蜜桃视频免费网站| 美女精品视频一区| 成人亚洲一区二区一| bbw在线视频| 欧美一卡2卡3卡4卡无卡免费观看水多多| 性感美女久久精品| 精品国产乱码久久久久久1区2匹| 日本888xxxx| 九九热在线精品视频| 91麻豆swag| 久久福利在线| 丁香色欲久久久久久综合网| 精品视频在线观看日韩| 日韩高清不卡一区二区三区| 黄网站在线播放| 久久久精彩视频| 欧美性生活影院| 牛牛国产精品| 青春有你2免费观看完整版在线播放高清| 欧美重口另类videos人妖| 国产欧美日韩在线| 91在线一区| 2021av天天| 国产精品网站视频| 亚洲综合在线第一页| 国产欧美日韩视频在线| 日本高清中文字幕| 国产精品日韩在线| 欧美视频在线视频| 狠狠噜噜久久| 精品自拍一区| 亚洲综合第一| 中文字幕亚洲欧美| 久久―日本道色综合久久| 欧美日韩导航| 亚洲美女电影在线| 欧美精品与人动性物交免费看| 欧美成人aa大片| 国v精品久久久网| 国产 日韩 欧美| 黄网址在线播放免费| 成人亚洲综合色就1024| 欧美日韩国产高清一区二区| 久久动漫亚洲| 日韩一级特黄| 91久久影院| 美女黄毛**国产精品啪啪| 亚洲精品一区二三区不卡| 久久久噜噜噜久噜久久综合| 亚洲美女15p| 在线观看麻豆| 亚洲色婷婷久久精品av蜜桃| 欧美精品免费播放| 性感美女极品91精品| 久久久精品午夜少妇| 成人精品国产亚洲| 在线观看免费视频高清游戏推荐| 国产精品久久久久久久电影| 制服丝袜亚洲网站| 91小视频在线免费看| 欧美一区二区性| 国产精品69xx| 琪琪五月天综合婷婷| 高清一区二区三区视频| 日韩精品免费在线播放| 中文一区在线播放| 一本综合久久| 九九99久久精品在免费线bt| 偷拍25位美女撒尿视频在线观看| 日本不卡一区|