精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

聊一聊Typescript 高級技巧

開發(fā) 前端
用了一段時間的 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 的區(qū)別是什么?可以參考以下 stackoverflow 的問題

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

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

  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泄露模式

2021-01-28 22:31:33

分組密碼算法

2023-09-22 17:36:37

2020-05-22 08:16:07

PONGPONXG-PON

2018-06-07 13:17:12

契約測試單元測試API測試

2024-07-24 11:40:33

2023-07-06 13:56:14

微軟Skype

2021-02-06 08:34:49

函數memoize文檔

2022-11-01 08:46:20

責任鏈模式對象

2022-08-08 08:25:21

Javajar 文件

2019-02-13 14:15:59

Linux版本Fedora

2018-11-29 09:13:47

CPU中斷控制器

2023-05-15 08:38:58

模板方法模式

2021-01-29 08:32:21

數據結構數組

2020-10-15 06:56:51

MySQL排序

2022-11-26 00:00:06

裝飾者模式Component
點贊
收藏

51CTO技術棧公眾號

久久五月激情| 亚洲狠狠婷婷综合久久久| 中文字幕剧情在线观看一区| 美女的奶胸大爽爽大片| 国产乱子伦三级在线播放| 国产精品久久久久久久久久齐齐| 久久精品免费一区二区三区| 欧美日韩午夜剧场| 美女久久久久久久| 黄色在线视频网| 日本精品一二区| **女人18毛片一区二区| 欧美优质美女网站| 亚洲自拍av在线| 国产精九九网站漫画| 色综合久久久久综合一本到桃花网| 仙踪林久久久久久久999| 精品久久久久久久久久久久包黑料| 久99久在线| 欧美日韩精品亚洲精品| 国产麻豆一区二区三区| av成人老司机| 中文字幕日韩综合av| 男人靠女人免费视频网站 | www.youjizz.com亚洲| 欧美成人黄色| 精品国产电影一区| 久久九九视频| www香蕉视频| 亚洲素人在线| 欧美日韩国产中文精品字幕自在自线 | 四虎影视成人| 国产一区不卡精品| 久久不射电影网| aaaaaaaa毛片| 色呦呦在线资源| 国产精品色一区二区三区| 韩国欧美亚洲国产| 欧类av怡春院| 免费成人直播| 国产成人av在线影院| 欧美肥婆姓交大片| 99热超碰在线| 久久r热视频| 亚洲va天堂va国产va久| 开心色怡人综合网站| 精品久久久久久久久久久国产字幕| 国产在线一区不卡| 欧美伊人久久大香线蕉综合69| 久久99国产精品一区| 国产成人精品a视频| 欧美一区二区三| 欧美日韩一区在线观看| 椎名由奈jux491在线播放| 成人福利小视频| 久久一二三区| 国产ts一区二区| 青青草原亚洲| 91香蕉视频免费看| 国产精品亚洲成在人线| 欧美伊人久久久久久午夜久久久久| 亚洲欧洲在线一区| 欧美brazzers| 乱人伦精品视频在线观看| 自拍偷拍亚洲一区| 永久免费观看片现看| 亚洲三级av| 在线精品观看国产| 久久男人资源站| 国产熟女精品视频| 国产亚洲精品bv在线观看| 中文字幕亚洲综合久久筱田步美| 亚洲精品一二三四| 中文字幕资源网在线观看免费 | 久久综合色视频| 亚洲第一天堂在线观看| 亚洲综合日本| 欧美老女人性视频| 日本一区二区视频在线播放| 一区二区三区视频播放| 精品少妇一区二区三区在线播放| 香港日本韩国三级网站| 欧美大片网站| 日韩一本二本av| 欧美 日韩精品| 成人区精品一区二区不卡| 91丨九色丨尤物| 91色在线观看| 欧美性猛交xxxx乱大交hd| 狠狠入ady亚洲精品| 日韩亚洲精品视频| 亚洲av无码成人精品国产| 日韩一区二区三区精品视频第3页| 亚洲女厕所小便bbb| 日本免费高清不卡| 男人资源在线播放| av小说在线观看| 波多野结衣黄色| 日韩精品乱码免费| 亚洲色图第一页| 久久久国产精品久久久| 久久久久久久久国产精品| 毛片av在线播放| 北岛玲一区二区三区| 日韩av一级片| 草逼视频免费看| 欧美日韩亚洲一区三区| 欧美在线视频你懂得| www.99r| 国产成人精品亚洲日本在线观看| 国产精品美女久久久久高潮| 永久免费网站视频在线观看| eeuss影院在线播放| 国产欧美日韩精品一区| 国产在线观看91精品一区| 97免费在线观看视频| 欧美视频二区| 国产精品69久久久久| 99久久精品免费看国产交换| 国产一区二区免费看| 精品无码久久久久久久动漫| 秋霞网一区二区| 国产精品久久毛片av大全日韩| 在线观看亚洲视频啊啊啊啊| f2c人成在线观看免费视频| 久久久国产精品不卡| 久久精品国产理论片免费| 先锋av资源站| 韩国理伦片一区二区三区在线播放| 欧美精品xxx| 国产无套在线观看| 极品少妇xxxx偷拍精品少妇| 91香蕉视频在线下载| 国产婷婷一区二区三区久久| 久久伊人蜜桃av一区二区| 茄子视频成人在线观看| 高h视频在线播放| 中文字幕一区二区三区不卡在线| 国产偷久久久精品专区| 日批视频免费播放| 91丨porny丨国产入口| 中国一级黄色录像| 国产91精品在线| 亚洲色图偷窥自拍| 神马久久久久久久 | 国产欧美日韩视频在线观看| 亚洲一区二区三区色| 成人国产二区| 日韩禁在线播放| 国产精品无码网站| 国产精品密蕾丝视频下载| 一区二区三区黄色| 国产精品无码一区二区三区免费 | 欧美视频第二页| 久久精品无码一区| 久久成人福利| 亚洲欧美在线磁力| 性生交大片免费全黄| 综合国产精品| 国产91精品高潮白浆喷水| 青娱乐91视频| 国产精品亚洲综合久久| 国产精品亚洲激情| 亚洲av永久无码国产精品久久| 91蝌蚪国产九色| 国产最新免费视频| 欧美日韩国产免费观看视频| 久久人人爽人人爽人人片亚洲| 天天舔天天操天天干| 欧美99在线视频观看| 日本国产精品视频| 精品一区二区无码| 久久久777精品电影网影网 | 亚洲女同一区| 成人激情视频网| 水莓100国产免费av在线播放| 不卡av在线免费观看| 亚洲ai欧洲av| 伊人在线视频| 日韩午夜三级在线| 国产一区二区三区影院| 国产日韩欧美精品一区| 日本一本中文字幕| 岛国一区二区| 久久99久久99精品中文字幕| 色欲av伊人久久大香线蕉影院| 日韩理论片网站| aⅴ在线免费观看| 成人在线一区| 国产日韩欧美夫妻视频在线观看| 狠狠v欧美ⅴ日韩v亚洲v大胸| 国产农村妇女精品| 亚洲激情在线看| 亚洲激情亚洲| 97影院在线午夜| 一区二区精品伦理...| 主播福利视频一区| 免费激情视频网站| 欧美在线三级电影| 久久久久久久久久久久久久久久久 | 国产一区二区精品免费| 毛片无码国产| 亚洲欧美制服丝袜| 99久久精品无免国产免费| 亚洲成人777| 亚洲一区二区三区四区精品| 日韩免费在线| 国产精品午夜国产小视频| caopon在线免费视频| 亚洲精品网站在线播放gif| 久久久久99精品成人| 懂色av中文一区二区三区| 一区二区成人网| 亚洲毛片av| 穿情趣内衣被c到高潮视频| 久久av免费| 日本一区二区三区在线播放| 国产91在线视频蝌蚪| 亚洲视频专区在线| 人妻无码一区二区三区久久99| 午夜精品久久一牛影视| 懂色av粉嫩av蜜臀av一区二区三区| 伊人久久亚洲热| 国产精品专区一| 99re6在线精品视频免费播放| 国产网站欧美日韩免费精品在线观看| 黄色一级片免费在线观看| 99精品久久只有精品| 日本网站免费在线观看| 一本精品一区二区三区| 亚洲国产精品视频一区| 亚洲深夜福利在线观看| 国产美女在线精品免费观看| 久久人体大尺度| 日韩在线视频观看| 国产老妇伦国产熟女老妇视频| 久久蜜桃av一区二区天堂| 潘金莲激情呻吟欲求不满视频| 亚洲欧美综合国产精品一区| 亚洲欧美综合一区| 菠萝蜜一区二区| 日韩高清专区| 日韩免费在线电影| 亚洲网在线观看| 亚洲熟妇av乱码在线观看| 中文字幕亚洲电影| 无码人妻一区二区三区在线| 韩国毛片一区二区三区| 91传媒久久久| 国产精品一国产精品k频道56| 亚洲欧洲精品一区二区| 久久影视三级福利片| 国产一区二区三区四区hd| 成人盗摄视频| 国产不卡av在线| 成视频免费观看在线看| 久久亚洲精品小早川怜子66| 黄色小网站在线观看| 亚洲国产成人爱av在线播放| 日韩不卡高清视频| 91激情在线视频| 成年人av电影| 一区二区三区色| 亚洲精品国产一区黑色丝袜| 国产剧情一区在线| 亚洲熟妇av一区二区三区| 亚洲激情中文| 少妇久久久久久被弄到高潮| 一区久久精品| 无罩大乳的熟妇正在播放| 久久久www| 亚洲免费av一区| 国产精品456露脸| 日本成人中文字幕在线| 狠狠色综合网| 九一国产精品视频| 午夜欧美理论片| 僵尸世界大战2 在线播放| 欧美福利在线播放网址导航| 国产精品爽爽爽| **欧美日韩在线| 国产精品爱啪在线线免费观看| 成人h小游戏| 色噜噜狠狠狠综合曰曰曰| 超碰在线caoporn| 久久久在线免费观看| 午夜老司机在线观看| 久久手机精品视频| 91白丝在线| 国产精品美女999| 日韩电影av| 欧美亚洲一级片| 国产精品久久久久77777丨| av资源站久久亚洲| sis001欧美| 国产精品一区二区久久久| 亚洲成人看片| 3d精品h动漫啪啪一区二区| 日韩在线麻豆| 国内精品久久久久久久果冻传媒| 视频在线一区| 欧美极品一区| 欧洲亚洲视频| 一区二区在线观| 在线一区欧美| 毛片在线视频播放| 久久av中文字幕片| 中文字幕视频三区| 久久er99热精品一区二区| 中国一级特黄录像播放| 国产精品福利一区二区三区| 91精品少妇一区二区三区蜜桃臀| 日韩码欧中文字| 免费的毛片视频| 欧美午夜视频一区二区| 国产一级做a爱片久久毛片a| 综合av第一页| 久久青青草原亚洲av无码麻豆 | 在线观看91久久久久久| eeuss鲁一区二区三区| 91色视频在线观看| 四虎成人av| 一级二级三级欧美| 亚洲一区视频| 亚洲成年人在线观看| 亚洲视频在线一区二区| 久久久香蕉视频| 91精品国产综合久久蜜臀| 国产美女自慰在线观看| 亚洲偷欧美偷国内偷| 亚洲天堂资源| 精品综合在线| 欧美jizz| av无码精品一区二区三区| 91免费视频网址| 日本五十路女优| 色综合久久天天| 自拍偷拍福利视频| 91.成人天堂一区| a天堂中文在线| 国产成人+综合亚洲+天堂| 牲欧美videos精品| www.浪潮av.com| 91色porny在线视频| 日韩伦理在线视频| 欧美精品一区二区三区久久久| av网站在线观看免费| 色妞欧美日韩在线| 草草视频在线| 国产成人鲁鲁免费视频a| 四虎影视成人精品国库在线观看| 国产精品18毛片一区二区| 自拍偷拍欧美一区| 2022亚洲天堂| 久久亚洲春色中文字幕久久久| √天堂中文官网8在线| 午夜精品福利一区二区三区av | 高清中文字幕一区二区三区| 日韩免费观看av| 91蜜桃臀久久一区二区| 天堂社区 天堂综合网 天堂资源最新版| 欧美成人亚洲| 国产情侣久久久久aⅴ免费| 亚洲成人7777| 国产在线黄色| 国产欧美日韩中文| 欧美伊人久久| 成人在线视频免费播放| 色婷婷久久久久swag精品| 人妻夜夜爽天天爽| 欧洲亚洲女同hd| 日韩综合精品| 美女又黄又免费的视频| 自拍偷拍国产亚洲| 亚洲欧美黄色片| 亚洲国产欧美久久| 美女免费久久| 999在线观看免费大全电视剧| 日韩欧美精品| 久久精品一卡二卡| 亚洲成人av在线电影| 国际av在线| 亚洲xxxx视频| 丝袜美腿成人在线| 69av.com| 日韩一级在线观看| 在线女人免费视频| 婷婷视频在线播放| 国内综合精品午夜久久资源| youjizz.com日本| 欧洲一区二区三区在线| 最新av在线播放| 91精品国产综合久久香蕉| 欧美一区二区三区另类| 亚洲国产果冻传媒av在线观看| 国产日韩一级二级三级| 久久免费激情视频| 国产丝袜高跟一区| 亚洲最大的免费视频网站| 亚洲 欧美 日韩 国产综合 在线|