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

如何編寫健壯的 TypeScript 庫?

新聞 前端
當你用 TypeScript 編寫庫時,你通常不知道這個庫最終將如何被使用。

 當你用 TypeScript 編寫庫時,你通常不知道這個庫最終將如何被使用。即使你 警告潛在用戶,你編寫這個庫只是針對 TypeScript 用戶,你還是可能會在某個時刻擁有 JavaScript 用戶——或者是因為他們不顧你的警告而使用這個庫,或者是他們因為傳遞性依賴而使用這個庫。這有一個非常重要的后果:你必須將這個庫設計成任何語言的開發者都可以使用!

[[349529]]

其主要部分是函數定義和函數體。如果你針對一個純 TypeScript 讀者編寫,那么你只需定義函數類型并信任編譯器處理其它事情。如果你針對一個純 JavaScrpit 讀者編寫,那么你需要記錄那些類型,但在函數中將實際的類型設為unknown并檢查調用方傳遞的內容。

例如,給定如下代碼

  1. interface Person { 
  2.  
  3. age: number; 
  4.  
  5. name?: string; 
  6.  
  7.  
  8. function describe(person: Person): string { 
  9.  
  10. let name = person.name ?? 'someone'
  11.  
  12. return `${name} is ${person.age} years old!`; 
  13.  

一個 JS 用戶可能用任何東西來調用describe函數。

正確寫法:

  1. describe({ name: "chris" }) 

災難性的錯誤寫法: 

  1. describe("potato"); 

最常見的 JS 錯誤:

  1. describe(undefined); 

你的庫的 JS 用戶并不是故意這么做的。恰恰相反,在任何足夠大的系統中,很容易將錯誤的參數傳遞給系統中的某個函數。這通常是一個很難避免的錯誤,比如在一個點上做了修改,許多其它地方需要更新,但漏掉了一個點。故意的 JS 開發者會把壞數據發送到你設計精美的 TS API 中。

如果你針對一個純 TypeScript 讀者編寫,那么你只需定義函數類型并信任編譯器處理其它事情

我故意不提 TypeScript 編譯非常嚴格,從一個與 JavaScript 沒有區別的級別到幾乎任何人可能想到的嚴格級別。這意味著,即使是 TypeScript 調用者也應該像 JavaScript 調用者一樣被對待:眾所周知,他們到處亂扔any,忽略了事實上可能是null或undefined的地方。返回上面的示例代碼:

  1. interface Person { 
  2.  
  3. age: number; 
  4.  
  5. name?: string; 
  6.  
  7.  
  8. function describe(person: Person): string { 
  9.  
  10. let name = person.name ?? 'someone'
  11.  
  12. return `${name} is ${person.age} years old!`; 
  13.  

在沒有啟用嚴格標識的情況下,TypeScript 用戶可以如下調用describe:

  1. function cueTheSobbing(data: any) { 
  2.  
  3. describe(data); 
  4.  
  5.  
  6. cueTheSobbing({ breakfastOf: ["eggs""waffles"] }); 

或者這樣:

  1. describe(null); 

或者這樣:

  1. describe({ age: null }) 

也就是說:JS 調用者大部分會出錯的方式,TS 調用者在關閉嚴格性設置的情況下也會出錯。這意味著故意的 TypeScript 用戶也會用壞數據調用你的庫。而且由于他們依賴其它庫,這很可能不是他們的錯誤,因為這種問題可能發生在依賴圖中的任何地方。

因此,如果問題是我們不能信任數據,那么我們應該怎么做?一個選項是使函數的所有參數實際為unknown,并用 JSDoc 指定它該如何。然而,那樣會使我們失去大量 TS 提供的能力。當與函數交互時,我們即使在內部也不會得到補全或類型錯誤,更不用說我們的庫的用戶。但是正如我們剛剛看到的,我們也不能依賴類型定義來提供函數內部的安全性。不過,我們可以將這幾種方法結合起來:指定類型定義,并將傳入的數據視為實際上的unknown。這確實帶來了運行時開銷——我們稍后將圍繞這個權衡進行詳細討論。現在,我們可以先看看如何檢查類型。

首先,我們會像實際上會從調用者得到真正未知的數據來編寫我們的代碼,因為我們已經確定了這正是我們可能得到的。一旦我們完成了對unknown數據的校驗,我們就能夠將它替換為Person,而且所有東西都應該繼續工作,但是現在我們可以保證它對任何拋給它的數據都能夠工作。

  1. function describe(person: unknown): string { 
  2.  
  3. let name = person.name ?? 'someone'
  4.  
  5. return `${name} is ${person.age} years old`; 
  6.  

這里有類型錯誤,因為這里的person類型可能是undefined或"potato"或者任何其它類型。我們可以使用 TypeScript 的類型縮小的概念來保證安全。然而,從unknown縮小到特定的對象類型有點兒奇怪,因為如果你簡單地檢查是否typeof somethingUnknown === 'object',這會將類型縮小到{},這意味著它不會包含任何我們可能需要的類型。我們會先定義一個isObject輔助函數,它會為我們提供正確的語義:

  1. function isObject( 
  2.  
  3. maybeObj: unknown 
  4.  
  5. ): maybeObj is Record<string | number | symbol, unknown> { 
  6.  
  7. return typeof maybeObj === 'object' && maybeObj !== null
  8.  

我們還需要一種方法來檢查這個對象有沒有指定的屬性。如果in運算符能以這種方式工作就太好了,但不幸的是,它沒有這樣工作。我們也可以內聯這樣做,但是每次都需要類型轉換。我們可以稱之為has,類似于Object.hasOwnProperty方法。由于這還需要檢查isObject返回的類型集——在 JS 中索引一個對象的所有合法類型——我們這里會將其提取到一個新的Key類型。

這個has輔助函數的返回類型告訴類型系統,如果主體為 true,傳入的項目有其原始類型而且它包含我們要檢查的屬性。

  1. type Key = string | number | symbol; 
  2.  
  3. function has<K extends Key, T>( 
  4.  
  5. key: K, 
  6.  
  7. t: T 
  8.  
  9. ): t is T & Record<K, unknown> { 
  10.  
  11. return key in t; 
  12.  

現在我們可以將它們組合成一個類型保護器,來檢查給定對象是否是一個 person:

  1. function isPerson(value: unknown): value is Person { 
  2.  
  3. return ( 
  4.  
  5. isObject(value) && 
  6.  
  7. has('age', value) && typeof value.age === 'number' && 
  8.  
  9. (has('name', value) ? typeof value.name === 'string' : true
  10.  
  11.  

現在,我們可以將所有這些集合到我們函數頂部的一個簡單的檢查中,如果它不合法的話拋出一個有用的錯誤。

  1. function describe(person: unknown): string { 
  2.  
  3. if (!isPerson(person)) { 
  4.  
  5. throw new Error('`describe` requires you to pass a `Person`'); 
  6.  
  7.  
  8. let name = person.name ?? 'someone'
  9.  
  10. return `${name} is ${person.age} years old`; 
  11.  

既然我們已經有了這個功能,我們可以將這里的person類型更新為Person來讓 TypeScript 用戶有更好的體驗。

  1. function describe(person: Person): string { 
  2.  
  3. if (!isPerson(person)) { 
  4.  
  5. throw new Error( 
  6.  
  7. `'describe' takes a 'Person', but you passed ${JSON.stringify(person)}` 
  8.  
  9. ); 
  10.  
  11.  
  12. let name = person.name ?? 'someone'
  13.  
  14. return `${name} is ${person.age} years old`; 
  15.  

TypeScript 支持在條件不包含斷言函數時拋出的這種模式泛化,這非常有用。我們可以編寫如下格式:

  1. function assert
  2.  
  3. predicate: unknown, 
  4.  
  5. message: string 
  6.  
  7. ): asserts predicate { 
  8.  
  9. if (!pred) { 
  10.  
  11. throw new Error(message); 
  12.  
  13.  

現在我們的函數變得更簡單:

  1. function describe(person: Person): string { 
  2.  
  3. assert
  4.  
  5. isPerson(person), 
  6.  
  7. `'describe' takes a 'Person', but you passed ${JSON.stringify(person)}` 
  8.  
  9. ); 
  10.  
  11. let name = person.name ?? 'someone'
  12.  
  13. return `${name} is ${person.age} years old`; 
  14.  

到目前為止,一直都還不錯!我們現在保證,無論誰調用describe,無論是從 JS,還是從松散類型的 TS,或是從其它完全不同的語言,它都會做“正確”的事情,在出錯時向調用者提供一個可操作的錯誤。然而,根據我們的限制,這種運行時校驗會開銷過大而不可行。在一個瀏覽器中,我們通過網絡發送的額外代碼積累起來:需要下載更多東西,也需要解析更多東西,這都會減慢我們的 app。在任何環境中,每次與describe函數交互時都會進行額外的運行時檢查。一種選項是利用一些編譯智能來在開發期間而不是在生產構建中提供這些檢查。Babel 允許你將給定函數轉變成 noops,使得它們不完全沒有開銷,但開銷非常小。例如,Ember CLI 提供了一個 Babel 插件將 Ember 的assert函數(其類型與我在上面定義的assert幾乎等同)轉變成 no-ops。你可以將它與任何可以消除無用代碼的工具結合起來,以刪除所有沒有用到的輔助函數!

這種方案的缺點是,生產環境的錯誤的錯誤消息會比較糟糕,并且更難以調試。優點是,在生產環境中,你將上傳更少的代碼且運行時開銷更少。為了使依賴這種assert片段的代碼工作,終端用戶需要將它與任何具有良好的端到端測試覆蓋的功能、UI 組件等相結合。但是不管怎樣,這都是正確的:類型和測試消除了不同類型的 bugs,最好結合使用!

 

責任編輯:張燕妮 來源: 架構頭條
相關推薦

2025-06-11 03:22:00

JavaScript開發前端

2020-07-15 08:17:16

代碼

2020-06-01 09:40:06

開發ReactTypeScript

2022-08-19 09:01:59

ReactTS類型

2020-06-03 16:50:24

TypeScriptReact前端

2019-12-19 10:10:45

秒殺系統高并發

2025-03-11 08:30:00

Pythonretrying代碼

2025-01-14 00:01:01

2011-03-24 13:09:11

數據庫代碼

2010-07-13 11:47:47

2023-07-30 17:10:32

TypeScript開發

2015-12-21 16:43:29

智慧教育華為

2020-04-26 19:12:29

shell腳本Linux

2023-11-17 11:55:54

Pythonretrying庫

2022-08-04 09:01:45

TypeScriptMicrosoft

2012-07-11 10:51:37

編程

2022-10-17 09:08:01

2016-01-28 13:33:07

2022-02-25 08:00:00

編程ReactTypescript

2023-08-15 10:12:11

TypeScript標準庫
點贊
收藏

51CTO技術棧公眾號

天天爽天天狠久久久| 国模视频一区二区| 中文字幕第22页| 三级网站视频在在线播放| 国产999精品久久| 69**夜色精品国产69乱| 欧美福利第一页| 国产一区2区在线观看| 亚州成人在线电影| 日韩中文不卡| 亚洲精品一区二区三区新线路 | 久久综合九色综合久久久精品综合| 国产成人精品999| 校园春色 亚洲| 国产日韩视频在线| 欧美mv日韩mv| 91人人澡人人爽人人精品| 四季久久免费一区二区三区四区| 久久久噜噜噜久久中文字幕色伊伊| 亚洲va欧美va在线观看| 神马久久久久久久 | 国产淫片免费看| 免费av在线播放| 久久蜜桃av一区精品变态类天堂| 91麻豆精品秘密入口| 无码久久精品国产亚洲av影片| 韩国亚洲精品| 久久视频在线观看免费| japanese中文字幕| 女仆av观看一区| 日韩午夜在线观看| 第四色婷婷基地| 中文字幕在线免费观看视频| 一级精品视频在线观看宜春院| 亚洲午夜精品福利| 国产精品视频一区二区久久| 北条麻妃国产九九精品视频| 91在线看www| 亚洲综合网av| 麻豆视频观看网址久久| 国产99久久精品一区二区永久免费 | 欧美成人一品| 日韩视频免费观看| 97人妻人人揉人人躁人人| 亚州综合一区| 亚洲第一区在线| 2025中文字幕| 欧美日本三级| 日韩欧美www| 国产精品二区视频| 麻豆一区在线| 日韩美女主播在线视频一区二区三区| 久久人人爽av| crdy在线观看欧美| 欧美一级高清片在线观看| 成人日韩在线视频| 亚洲精品成a人ⅴ香蕉片| 欧美视频在线播放| 色播五月综合网| 成人亚洲视频| 欧美美女一区二区在线观看| 亚洲欧美日本一区二区三区| 香蕉久久一区| 日韩欧美国产三级电影视频| 日本中文字幕有码| 99久久人爽人人添人人澡| 精品国产伦一区二区三区观看体验| av影片在线播放| 国产乱人伦精品一区| 精品视频中文字幕| 91精品国自产在线| 久久久久久免费视频| 欧美成人一区在线| 国产精品成人aaaa在线| 国产亚洲精品自拍| 国产精品久久久久久亚洲影视 | 亚洲成人国产精品| 草草影院第一页| 欧美日韩一区二区三区视频播放| 日韩在线视频线视频免费网站| 日韩成人短视频| 亚洲婷婷在线| 国产成人综合久久| 91免费视频播放| 成人手机在线视频| 秋霞在线观看一区二区三区 | 久热精品视频在线观看一区| 国产一级做a爱免费视频| 亚洲国产片色| 国产精品久久久久77777| 国产精品视频久久久久久| 国产成人啪午夜精品网站男同| 国偷自产av一区二区三区小尤奈| 成人性爱视频在线观看| 亚洲卡通动漫在线| 日韩av片在线看| 亚洲国产一区二区久久| 亚洲成人国产精品| 五月婷婷六月香| 91久久视频| 国产精品一区二区女厕厕| 精品人妻伦一二三区久久 | 大胆人体一区| 91精品国产色综合久久| a级一a一级在线观看| 日韩毛片视频| 久久久女女女女999久久| 日本丰满少妇做爰爽爽| 国产成人免费视频网站高清观看视频| 欧美日韩高清免费| 99在线播放| 色综合久久88色综合天天免费| 宇都宫紫苑在线播放| 激情婷婷综合| 91国内在线视频| 国产女同91疯狂高潮互磨| 久久久天堂av| 又粗又黑又大的吊av| 久久伊人精品| 日韩在线观看高清| 亚洲图片在线视频| 成人av免费网站| 综合国产精品久久久| 在线观看特色大片免费视频| 欧美一级艳片视频免费观看| 亚洲av熟女国产一区二区性色| 中文在线不卡| 国产伦精品一区二区三区视频免费| 日本美女高清在线观看免费| 在线看日本不卡| aaaaa一级片| 亚洲高清激情| y111111国产精品久久婷婷| 日本www在线| 在线免费观看日韩欧美| 熟女高潮一区二区三区| 亚洲视频www| 精品蜜桃传媒| 麻豆视频在线观看免费网站黄| 日韩欧美国产成人一区二区| frxxee中国xxx麻豆hd| 麻豆精品视频在线观看免费| 色乱码一区二区三在线看| 欧美大片免费| 国产一区二区三区在线| 无码任你躁久久久久久久| 久久久精品黄色| 欧美黄色一级片视频| 亚洲影院天堂中文av色| 日本精品久久久| 日本a一级在线免费播放| 欧美日韩国产精品一区二区不卡中文 | 无人区在线高清完整免费版 一区二| 日韩av一卡二卡| 成人精品在线看| 99久久99久久免费精品蜜臀| 91视频 -- 69xx| 国产91一区| 国产成人综合久久| 日本在线免费看| 欧美一区二区视频网站| 黄页网站免费观看| 成人免费视频免费观看| 国产视频一视频二| 免费av一区二区三区四区| 日本国产精品视频| av一本在线| 欧美理论电影在线| 欧美日韩成人免费观看| jvid福利写真一区二区三区| 91精品91久久久中77777老牛| 九九热线有精品视频99| 国产日韩精品视频| 日本无删减在线| 国产午夜精品理论片a级探花| 乱子伦一区二区三区| 中文字幕在线观看一区二区| 亚洲成人福利视频| 裸体一区二区| 三年中文高清在线观看第6集 | 久热re这里精品视频在线6| 视频在线一区二区三区| 日韩一区二区三区在线看| 7777kkkk成人观看| 91高清在线视频| 精品国产精品一区二区夜夜嗨| 亚洲欧美综合另类| 国产精品婷婷午夜在线观看| 4438x全国最大成人| 日韩视频久久| 亚洲电影一二三区| 亚洲国产高清在线观看| 欧美亚洲视频一区二区| 日本高清视频在线播放| 精品女同一区二区| 日韩久久久久久久久久| 一区二区三区四区蜜桃| 免费污网站在线观看| 国产黄人亚洲片| 日韩免费高清在线| 狠久久av成人天堂| 亚洲不卡1区| 日本伊人久久| 国产精品视频成人| h片在线观看视频免费| 色琪琪综合男人的天堂aⅴ视频| 欧美一区,二区| 欧美电影一区二区三区| 超碰超碰超碰超碰| 一区二区三区91| 少妇愉情理伦三级| av亚洲精华国产精华精华| 欧美午夜精品理论片| 久久成人在线| 91免费黄视频| 91精品啪在线观看国产81旧版| 欧美在线一二三区| 成人看片爽爽爽| 91九色综合久久| 色香欲www7777综合网| 性金发美女69hd大尺寸| 99自拍视频在线观看| 三级精品视频久久久久| 黄色在线网站| 日韩精品免费在线| 老熟妇高潮一区二区高清视频| 欧美一区二区视频在线观看2022 | 国产成人午夜精品影院观看视频| 色一情一乱一伦一区二区三区日本| 一区在线免费观看| 日韩精品福利片午夜免费观看| 久久综合国产| 日韩hmxxxx| 国产成人黄色| 欧美日韩国产三区| 欧美aaaaa级| 国产日韩欧美二区| julia中文字幕一区二区99在线| 7777精品伊久久久大香线蕉语言 | 国产做a爰片久久毛片| 天美星空大象mv在线观看视频| 久久国产精品久久久久久电车 | 91高清免费观看| 国产精品素人视频| 国产三级短视频| 欧美国产乱子伦| 国产7777777| 中文在线一区二区| 天天摸日日摸狠狠添| 欧美高清一级片在线观看| 91网站免费视频| 国产日韩欧美高清在线| 午夜影院黄色片| 国产精品理伦片| 欧美视频www| 亚洲激情综合网| 精品一区二区三区人妻| 亚洲一区在线观看免费观看电影高清| 久久久全国免费视频| 亚洲成av人片观看| 日韩欧美在线观看免费| 91成人网在线| 中文字幕在线观看第二页| 欧美高清视频在线高清观看mv色露露十八 | 青春草在线视频| 久久久久久久久久国产精品| 538视频在线| 日韩av免费在线| 欧美在线一级| 成人欧美一区二区| 欧美重口另类| 亚洲一卡二卡三卡四卡无卡网站在线看| 婷婷激情图片久久| 成人免费观看在线| 亚洲一区二区毛片| 中文字幕第88页| 成人免费视频播放| 欧美成人国产精品一区二区| 中文字幕欧美一| 99免费在线观看| 在线视频一区二区免费| 国产精品高潮呻吟av| 亚洲成人黄色在线| 在线播放麻豆| 欧美精品videosex极品1| 欧美粗大gay| 91视频免费在线观看| 美女少妇全过程你懂的久久| 免费看啪啪网站| 国产欧美日本| 国产三级精品三级在线| 91免费版在线| 在线观看成人毛片| 色婷婷国产精品久久包臀 | 激情小说亚洲一区| 五月天丁香社区| 国产精品色眯眯| 懂色av.com| 欧美高清激情brazzers| 水莓100在线视频| 久热爱精品视频线路一| 校园春色亚洲色图| 国产69精品久久久久9999apgf | 欧美国产视频一区| 日韩精品五月天| 扒开伸进免费视频| 国产精品久久午夜| 国产成人无码av| 日韩一区二区在线观看视频| 黄色在线免费观看大全| 久久久伊人日本| 国产精品免费精品自在线观看| 久久偷窥视频| 黄色亚洲大片免费在线观看| 色噜噜狠狠永久免费| 久久蜜桃一区二区| 五月天婷婷网站| 日韩欧美国产wwwww| 欧美精品日韩少妇| 国产精品第10页| 色狠狠久久av综合| 日韩一级片免费视频| 国产美女视频一区| 男女男精品视频网站| 日韩欧美一区二区在线| 日批免费在线观看| 久久91精品国产| 国产精品美女久久久久| 一级特黄录像免费播放全99| 日韩二区在线观看| 国产精品密蕾丝袜| 日韩欧美在线免费观看| 五月天丁香视频| 久久久久久美女| 哺乳挤奶一区二区三区免费看| 色哟哟免费网站| 久久成人免费网站| 免费成人美女女在线观看| 欧美在线制服丝袜| 福利视频在线导航| 国产精品精品国产| 欧美午夜精品一区二区三区电影| 亚洲人成色77777| 久久久久久电影| 无码免费一区二区三区| 亚洲人成人99网站| 亚洲综合在线电影| 亚洲第一在线综合在线| 久久精品国产秦先生| 日韩一卡二卡在线观看| 制服丝袜激情欧洲亚洲| 黄视频在线观看网站| 91在线观看免费高清| 欧美日韩视频| 国产伦精品一区二区三区精品| 午夜精品久久久| 日本在线一二三| 国产精品黄视频| 日韩午夜电影网| 奇米777在线| 亚洲国产成人精品视频| 午夜福利一区二区三区| 国产成人精品久久二区二区| 欧美日韩性在线观看| 婷婷激情5月天| 性做久久久久久免费观看欧美| 男人的天堂在线视频| 国产精品亚洲欧美导航| 自拍日韩欧美| 永久免费未满蜜桃| 欧美性xxxxx| 日本高清视频在线播放| 高清不卡一区二区三区| 久久久蜜桃一区二区人| av最新在线观看| 精品乱人伦小说| 色老太综合网| 国产午夜精品视频一区二区三区| 波多野结衣亚洲一区| 中国一级片黄色一级片黄| 欧美日韩国产999| 亚洲精品合集| 日本美女久久久| 欧美色播在线播放| 在线观看的av| 国产精品乱子乱xxxx| 首页亚洲欧美制服丝腿| 午夜精品福利在线视频| 亚洲精品久久久一区二区三区| 在线一区视频观看| 菠萝蜜视频在线观看入口| 国产亚洲午夜高清国产拍精品| 国产按摩一区二区三区| 日韩av电影国产| 国产综合视频| 国产7777777| 亚洲美女在线观看| 日本在线一区二区三区| 黄色三级视频片| 亚洲一区二区三区四区的|