精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

黑人操日本美女| 色欲欲www成人网站| 国产一二三区在线视频| 麻豆精品一二三| 九九久久国产精品| 精品无码在线视频| 亚瑟国产精品| 午夜成人免费视频| 色播亚洲视频在线观看| 亚洲第一免费视频| 久久亚洲影院| 九九热精品视频国产| 亚洲成人网在线播放| 国产一区 二区| 色就色 综合激情| 永久免费看av| 国产福利第一视频在线播放| 成人性生交大片免费看中文 | 国产在线精品一区| 在线免费观看一级片| 1024精品一区二区三区| 日韩亚洲欧美成人| 麻豆精品免费视频| av动漫精品一区二区| 欧美日韩日日骚| 妺妺窝人体色www在线小说| 日韩专区在线| 久久久不卡网国产精品二区 | 国产模特av私拍大尺度| 国产婷婷精品| 久久久久久九九九| 国产精品老熟女一区二区| 国产日产精品_国产精品毛片| 日韩精品中文字幕在线不卡尤物| 欧美三级理论片| 亚洲承认视频| 好吊成人免视频| 日韩精品视频在线观看视频| 国产福利视频在线观看| 国产精品亲子乱子伦xxxx裸| 青青草成人激情在线| 亚洲三级黄色片| 波多野结衣91| 国产精品综合久久久久久| 99免费在线视频| 国产曰批免费观看久久久| 国产精品高清网站| 国产亚洲欧美日韩高清| 午夜在线视频一区二区区别| 69av在线播放| 亚洲伊人成人网| 国产精品久久久久9999高清| 高清欧美一区二区三区| 久一视频在线观看| 国内精品久久久久国产盗摄免费观看完整版| 一区二区三区美女xx视频| 成人性生交大片免费看无遮挡aⅴ| 亚洲精品一级二级三级| 亚洲男人天堂2019| 亚洲第一成人网站| 精品国产不卡| 中文字幕综合在线| 91香蕉视频网| 午夜精品久久| 国内外成人免费激情在线视频| 亚洲一区欧美在线| 99热免费精品在线观看| 欧美最顶级的aⅴ艳星| 亚洲欧美综合另类| 奇米一区二区三区av| 91精品久久久久久久久中文字幕| 国产有码在线观看| 国产精品自拍网站| 精品产品国产在线不卡| 国产专区在线| 综合欧美一区二区三区| 成人性做爰片免费视频| 蜜桃传媒在线观看免费进入| 精品久久久视频| 久久久久久久久久福利| 久久久加勒比| 日韩欧美亚洲一区二区| 三叶草欧洲码在线| 99精品全国免费观看视频软件| 久久夜色精品国产亚洲aⅴ| 久久亚洲精品大全| 亚洲欧美高清| 成人午夜黄色影院| 污污的视频网站在线观看| 国产人久久人人人人爽| 国产乱子伦精品视频| 韩日毛片在线观看| 欧美日韩午夜在线| 中文字幕99页| 国产一区二区精品久| 欧美成人三级视频网站| 日韩欧美中文字幕一区二区| 日韩精品一级中文字幕精品视频免费观看 | 欧美一区二区三区播放老司机| www.啪啪.com| 日韩电影在线视频| 国内揄拍国内精品少妇国语| 最新黄色网址在线观看| 成人h精品动漫一区二区三区| 日韩精品伦理第一区| 欧美女同一区| 欧美日韩国产片| 国产特黄级aaaaa片免| 欧美精品色网| 国产在线视频不卡| 水中色av综合| 亚洲狠狠丁香婷婷综合久久久| 国产淫片av片久久久久久| 涩爱av色老久久精品偷偷鲁| 国产一区二区三区精品久久久| 久久精品国产av一区二区三区| 麻豆免费精品视频| 麻豆精品视频| www.综合网.com| 日韩欧美中文一区| 性色国产成人久久久精品| 亚洲尤物精选| 国产精品一 二 三| 在线播放免费av| 欧美日精品一区视频| 黑人巨大精品欧美| 激情婷婷久久| 99精彩视频在线观看免费| 日本网站在线免费观看视频| 午夜精品久久久久久久99水蜜桃| 日韩av影视大全| 欧美一级精品片在线看| 欧美主播福利视频| 手机在线不卡av| 亚洲一区日韩精品中文字幕| 亚洲欧美日韩三级| 青青草91久久久久久久久| 日韩男女性生活视频| 午夜影院免费体验区| 亚洲成人免费影院| 中文字幕99页| 亚洲无线一线二线三线区别av| 亚洲一区二区三区视频| 成年人黄视频在线观看| 91精品国产一区二区人妖| 久久av红桃一区二区禁漫| 麻豆视频一区二区| 一区二区日本伦理| 欧美jizz18| 久久久成人av| www男人的天堂| 亚洲在线观看免费视频| 中文字幕在线观看91| 韩日精品视频| 国产日韩免费| 中文字幕日韩欧美| 国产成人麻豆免费观看| 久久在线观看免费| 日韩久久一级片| 综合综合综合综合综合网| 人妖精品videosex性欧美| 青青草免费观看免费视频在线| 午夜成人免费电影| 成人无码www在线看免费| 欧美一级一区| 午夜精品福利一区二区| 国产精品4hu.www| 自拍偷拍亚洲一区| 国产情侣一区二区| 亚洲自拍另类综合| 五月天丁香社区| 在线亚洲观看| 日韩理论片在线观看| 国模私拍国内精品国内av| 日韩中文字幕在线观看| 国产ts人妖调教重口男| 一卡二卡三卡日韩欧美| 日韩综合第一页| 亚洲破处大片| 国产精品久久久久久久久久久不卡| 无码国产精品一区二区色情男同| 日本久久精品电影| 色偷偷男人天堂| 国产精品影视在线| 水蜜桃色314在线观看| 欧美激情在线精品一区二区三区| 国产美女搞久久| 黑人玩欧美人三根一起进| 亚洲精品永久免费| 91久久精品无码一区二区| 亚洲午夜激情av| 中国特黄一级片| www.亚洲人| 亚洲色图 在线视频| 国产字幕视频一区二区| 欧美伦理一区二区| 久久中文字幕一区二区| 26uuu另类亚洲欧美日本一 | av在线播放一区二区| 性欧美xxxx| 自拍视频在线免费观看| 欧美精品一区二区三区在线 | 日韩欧美视频一区二区三区四区| 精品国产欧美| 日韩av色在线| 波多野结衣中文在线| 自拍偷拍亚洲精品| 日本一本草久在线中文| 日韩欧美色综合| 中文字幕在线视频免费| 黄色成人在线免费| 中文字幕av久久爽av| 亚洲国产精品成人综合| 国产毛片毛片毛片毛片毛片毛片| 国产一区二区三区久久久| 精品视频无码一区二区三区| 中文字幕亚洲综合久久五月天色无吗'' | 亚洲一区二区视频在线播放| 欧美性猛交丰臀xxxxx网站| 精品少妇爆乳无码av无码专区| 国产精品久久久久aaaa樱花| 人妻丰满熟妇av无码久久洗澡| 国产一区二区毛片| 日本黄色的视频| 日韩精品色哟哟| 欧美二区在线视频| 国自产拍偷拍福利精品免费一 | 91文字幕巨乱亚洲香蕉| 日韩大陆av| 国产精品青草久久久久福利99| 深夜成人在线| 97福利一区二区| 久久久123| 久久成年人免费电影| 免费黄色在线网站| 久久精品99无色码中文字幕| av在线免费一区| 在线看国产精品| 92国产在线视频| 一本色道久久综合狠狠躁篇怎么玩| 日韩欧美在线番号| 亚洲精品一区二区三区不| 深夜福利视频一区| 亚洲精品视频在线观看视频| 亚洲人视频在线观看| 精品视频在线播放免| 色av男人的天堂免费在线| 日韩av在线导航| 日av在线播放| 亚洲区在线播放| 国产高清在线看| 最近2019免费中文字幕视频三| www.91在线| 久久精品国产久精国产一老狼| 在线观看麻豆蜜桃| 久久精品国产综合| av毛片在线| 欧美激情xxxx| 99热99re6国产在线播放| 97国产精品视频人人做人人爱| 2021天堂中文幕一二区在线观| 91精品国产高清自在线看超| av资源亚洲| 国产精品日韩av| 婷婷精品久久久久久久久久不卡| 92国产精品视频| av不卡一区| 久久99精品国产一区二区三区| 国产欧美高清视频在线| 亚洲一区尤物| 午夜久久一区| 日韩av综合在线观看| 三级欧美韩日大片在线看| 69久久久久久| 国产激情偷乱视频一区二区三区| 人妻 丝袜美腿 中文字幕| 91麻豆123| 黄大色黄女片18免费| 一区二区三区高清不卡| 国产精品黄色网| 欧美三区免费完整视频在线观看| 国产美女明星三级做爰| 亚洲国产一区二区三区四区| 国产视频第一区| 美女精品视频一区| 小草在线视频免费播放| 国产在线日韩在线| 人人精品视频| 一本一道久久a久久综合精品| 精品二区视频| 一区二区三区视频在线观看免费| 国产乱码精品一区二区三区av| 星空大象在线观看免费播放| 中国av一区二区三区| 国产亚洲精品久久久久久打不开| 一本大道综合伊人精品热热 | 免费视频成人| 国产精品免费一区二区三区四区| 国产一区二区三区四区| 亚洲色婷婷久久精品av蜜桃| 美女精品在线观看| 日本r级电影在线观看| 久久夜色精品国产欧美乱极品| 欧美在线视频第一页| 色一情一乱一乱一91av| 亚洲欧美另类综合| 色综合伊人色综合网站| 欧美少妇精品| 99re国产视频| 日韩高清欧美| 免费黄色福利视频| 国产999精品久久久久久绿帽| 舐め犯し波多野结衣在线观看| 亚洲一区免费观看| 一本色道久久综合亚洲| 亚洲女人天堂av| 欧美人与动牲性行为| 成人亚洲欧美一区二区三区| 视频一区中文| 国自产拍偷拍精品啪啪一区二区| 久久www免费人成看片高清| 女人又爽又黄免费女仆| 五月婷婷激情综合| 国产成人精品毛片| 久久精品99无色码中文字幕| 影视一区二区三区| 久久综合给合久久狠狠色| 亚洲黄色成人| 第一页在线视频| 亚洲欧美色图小说| 91极品身材尤物theporn| 国产亚洲综合久久| 澳门成人av网| 久久亚洲国产精品日日av夜夜| 国模 一区 二区 三区| 国产精品91av| 一区二区三区在线观看动漫| av资源免费看| 久久国产加勒比精品无码| 亚洲成a人片777777久久| 亚洲国产一区二区在线| 狂野欧美一区| 免费看裸体网站| 欧洲一区在线电影| 福利在线播放| 国产精品自产拍在线观看| 97精品一区| 国产欧美精品一二三| 国产精品成人一区二区三区夜夜夜| 中文字幕 视频一区| 一本色道久久88综合亚洲精品ⅰ | 欧美久久久久久久久中文字幕| 色多多视频在线观看| 成人黄色网免费| 欧美黄色免费| www.啪啪.com| 色哟哟日韩精品| 9i精品一二三区| 国产一区二区丝袜| 影音先锋成人在线电影| 在线观看免费看片| 亚洲成a人在线观看| 亚洲人在线观看视频| 国产精品久久久久久久久久久新郎| 欧美日韩一二三四| 99国产精品久久久久久| 尤物av一区二区| 偷拍精品一区二区三区| 日本a级片电影一区二区| 精品国产一区二区三区久久久樱花 | 亚洲精品mv| 日韩偷拍一区二区| 激情综合五月天| 久久久久久久极品内射| 日韩精品视频免费专区在线播放| 亚洲第一二三四区| 91xxx视频| www.成人在线| 中文字幕精品无码亚| 欧美成人免费一级人片100| 你懂的在线观看一区二区| 欧美少妇性生活视频| 亚洲欧美一区二区在线观看| 亚洲老妇色熟女老太| 日本精品视频网站| 久久久人成影片免费观看| 影音先锋资源av| 在线观看国产日韩| a毛片在线看免费观看| 国产一区二区三区av在线| 奇米精品一区二区三区四区| 欧美三级小视频| 亚洲天堂av在线免费| 日韩中文字幕一区二区高清99| 国产成人精品无码播放| 一区二区三区**美女毛片| 黄视频在线观看免费| 99在线观看| 久久国产夜色精品鲁鲁99| 自拍偷拍欧美亚洲|