国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁(yè) web前端 js教程 掌握 TypeScript 的模式匹配:提高程式碼的功能和安全性

掌握 TypeScript 的模式匹配:提高程式碼的功能和安全性

Dec 10, 2024 am 01:43 AM

Mastering TypeScript

TypeScript 的可區(qū)分聯(lián)合是一個(gè)強(qiáng)大的功能,可以將模式匹配提升到一個(gè)新的水平。它們使我們能夠創(chuàng)建複雜的、類(lèi)型安全的條件邏輯,而不僅僅是簡(jiǎn)單的 switch 語(yǔ)句。我在最近的專(zhuān)案中廣泛使用了這種技術(shù),它改變了我在 TypeScript 中處理控制流程的方式。

讓我們從基礎(chǔ)開(kāi)始??蓞^(qū)分聯(lián)合是一種使用公共屬性來(lái)區(qū)分不同變異的類(lèi)型。這是一個(gè)簡(jiǎn)單的例子:

type Shape =
  | { kind: 'circle'; radius: number }
  | { kind: 'rectangle'; width: number; height: number }

這裡的「種類(lèi)」屬性是我們的判別式。它允許 TypeScript 根據(jù)其值推斷我們正在處理的特定形狀。

現(xiàn)在,讓我們看看如何使用它進(jìn)行模式匹配:

function getArea(shape: Shape): number {
  switch (shape.kind) {
    case 'circle':
      return Math.PI * shape.radius ** 2
    case 'rectangle':
      return shape.width * shape.height
  }
}

這很簡(jiǎn)潔,但這只是個(gè)開(kāi)始。我們可以更進(jìn)一步。

受歧視工會(huì)最強(qiáng)大的方面之一是詳盡檢查。 TypeScript 可以確保我們?cè)谀J狡ヅ渲刑幚砹怂锌赡艿那闆r。讓我們?yōu)槲覀兊穆?lián)合添加一個(gè)新形狀:

type Shape =
  | { kind: 'circle'; radius: number }
  | { kind: 'rectangle'; width: number; height: number }
  | { kind: 'triangle'; base: number; height: number }

function getArea(shape: Shape): number {
  switch (shape.kind) {
    case 'circle':
      return Math.PI * shape.radius ** 2
    case 'rectangle':
      return shape.width * shape.height
    // TypeScript will now warn us that we're not handling the 'triangle' case
  }
}

為了使其更加健壯,我們可以新增一個(gè)引發(fā)錯(cuò)誤的預(yù)設(shè)情況,確保我們永遠(yuǎn)不會(huì)意外忘記處理新情況:

function assertNever(x: never): never {
  throw new Error("Unexpected object: " + x);
}

function getArea(shape: Shape): number {
  switch (shape.kind) {
    case 'circle':
      return Math.PI * shape.radius ** 2
    case 'rectangle':
      return shape.width * shape.height
    case 'triangle':
      return 0.5 * shape.base * shape.height
    default:
      return assertNever(shape)
  }
}

現(xiàn)在,如果我們新增形狀而不更新 getArea 函數(shù),TypeScript 會(huì)給我們一個(gè)編譯時(shí)錯(cuò)誤。

但是我們可以透過(guò)模式匹配走得更遠(yuǎn)。讓我們來(lái)看一個(gè)涉及嵌套模式的更複雜的範(fàn)例。

想像一下我們正在為交通燈建造一個(gè)簡(jiǎn)單的狀態(tài)機(jī):

type TrafficLightState =
  | { state: 'green' }
  | { state: 'yellow' }
  | { state: 'red' }
  | { state: 'flashing', color: 'yellow' | 'red' }

function getNextState(current: TrafficLightState): TrafficLightState {
  switch (current.state) {
    case 'green':
      return { state: 'yellow' }
    case 'yellow':
      return { state: 'red' }
    case 'red':
      return { state: 'green' }
    case 'flashing':
      return current.color === 'yellow'
        ? { state: 'red' }
        : { state: 'flashing', color: 'yellow' }
  }
}

在這裡,我們不僅匹配頂級(jí)狀態(tài),而且當(dāng)我們處?kù)丁搁W爍」?fàn)顟B(tài)時(shí)也匹配嵌套屬性。

我們也可以使用守衛(wèi)為我們的模式匹配添加更複雜的條件:

type WeatherEvent =
  | { kind: 'temperature', celsius: number }
  | { kind: 'wind', speed: number }
  | { kind: 'precipitation', amount: number }

function describeWeather(event: WeatherEvent): string {
  switch (event.kind) {
    case 'temperature':
      if (event.celsius > 30) return "It's hot!"
      if (event.celsius < 0) return "It's freezing!"
      return "The temperature is moderate."
    case 'wind':
      if (event.speed > 100) return "There's a hurricane!"
      if (event.speed > 50) return "It's very windy."
      return "There's a gentle breeze."
    case 'precipitation':
      if (event.amount > 100) return "It's pouring!"
      if (event.amount > 0) return "It's raining."
      return "It's dry."
  }
}

這種模式匹配方法不僅限於 switch 語(yǔ)句。我們可以將它與 if-else 鏈一起使用,甚至可以與物件文字一起使用以實(shí)現(xiàn)更複雜的場(chǎng)景:

type Action =
  | { type: 'INCREMENT' }
  | { type: 'DECREMENT' }
  | { type: 'RESET' }
  | { type: 'SET', payload: number }

const reducer = (state: number, action: Action): number => ({
  INCREMENT: () => state + 1,
  DECREMENT: () => state - 1,
  RESET: () => 0,
  SET: () => action.payload,
}[action.type]())

這種方法在實(shí)作訪客模式時(shí)特別有用。這是我們?nèi)绾问褂每蓞^(qū)分聯(lián)合來(lái)實(shí)作簡(jiǎn)單表達(dá)式求值器的範(fàn)例:

type Expr =
  | { kind: 'number'; value: number }
  | { kind: 'add'; left: Expr; right: Expr }
  | { kind: 'multiply'; left: Expr; right: Expr }

const evaluate = (expr: Expr): number => {
  switch (expr.kind) {
    case 'number':
      return expr.value
    case 'add':
      return evaluate(expr.left) + evaluate(expr.right)
    case 'multiply':
      return evaluate(expr.left) * evaluate(expr.right)
  }
}

const expr: Expr = {
  kind: 'add',
  left: { kind: 'number', value: 5 },
  right: {
    kind: 'multiply',
    left: { kind: 'number', value: 3 },
    right: { kind: 'number', value: 7 }
  }
}

console.log(evaluate(expr))  // Outputs: 26

這種模式允許我們輕鬆地使用新類(lèi)型的表達(dá)式來(lái)擴(kuò)展我們的表達(dá)式系統(tǒng),並且 TypeScript 將確保我們處理評(píng)估函數(shù)中的所有情況。

這種方法最強(qiáng)大的方面之一是它如何允許我們將大型、複雜的條件區(qū)塊重構(gòu)為更易於管理和擴(kuò)展的結(jié)構(gòu)。讓我們來(lái)看一個(gè)更複雜的例子:

想像一下我們正在建立一個(gè)系統(tǒng)來(lái)處理不同類(lèi)型的金融交易:

type Shape =
  | { kind: 'circle'; radius: number }
  | { kind: 'rectangle'; width: number; height: number }

在此範(fàn)例中,我們使用 TypeScript 的映射類(lèi)型和條件類(lèi)型來(lái)建立類(lèi)型安全對(duì)象,其中每個(gè)鍵對(duì)應(yīng)於一種事務(wù)類(lèi)型,每個(gè)值都是處理該特定類(lèi)型事務(wù)的函數(shù)。這種方法使我們能夠輕鬆新增類(lèi)型的交易,而無(wú)需更改handleTransaction函數(shù)的核心邏輯。

這種模式的美妙之處在於它既是類(lèi)型安全的又是可擴(kuò)展的。如果我們新增一個(gè)新的交易類(lèi)型,TypeScript 會(huì)強(qiáng)制我們加入對(duì)應(yīng)的處理器函數(shù)。如果我們嘗試處理不存在的交易類(lèi)型,我們將收到編譯時(shí)錯(cuò)誤。

這種具有可區(qū)分聯(lián)合的模式匹配方法可以產(chǎn)生更具表現(xiàn)力、更安全和自記錄的 TypeScript 程式碼,尤其是在複雜的應(yīng)用程式中。它使我們能夠以可讀且可維護(hù)的方式處理複雜的邏輯。

隨著我們的應(yīng)用程式變得越來(lái)越複雜,這些技術(shù)變得越來(lái)越有價(jià)值。它們使我們能夠編寫(xiě)不僅正確而且易於理解和修改的程式碼。透過(guò)充分利用 TypeScript 的類(lèi)型系統(tǒng),我們可以創(chuàng)建健壯、靈活的系統(tǒng),並且使用起來(lái)很愉快。

請(qǐng)記住,我們的目標(biāo)不僅僅是編寫(xiě)有效的程式碼,而是編寫(xiě)能夠清楚表達(dá)其意圖並且能夠在需求變化時(shí)防止錯(cuò)誤的程式碼。與可區(qū)分聯(lián)合的模式匹配是實(shí)現(xiàn)此目標(biāo)的強(qiáng)大工具。

根據(jù)我的經(jīng)驗(yàn),採(cǎi)用這些模式可以顯著提高程式碼品質(zhì)和開(kāi)發(fā)速度。需要一些時(shí)間來(lái)習(xí)慣用可區(qū)分的聯(lián)合和詳盡的模式匹配來(lái)思考,但一旦你這樣做了,你會(huì)發(fā)現(xiàn)它為以清晰、類(lèi)型安全的方式構(gòu)建代碼開(kāi)闢了新的可能性。

當(dāng)您繼續(xù)探索 TypeScript 時(shí),我鼓勵(lì)您尋找機(jī)會(huì)在自己的程式碼中應(yīng)用這些模式。從小事做起,也許可以將複雜的 if-else 鏈重構(gòu)為可區(qū)分聯(lián)合。隨著您對(duì)這項(xiàng)技術(shù)越來(lái)越熟悉,您將開(kāi)始看到越來(lái)越多的地方可以應(yīng)用它來(lái)簡(jiǎn)化和澄清您的程式碼。

請(qǐng)記住,TypeScript 的真正力量不僅在於它捕捉錯(cuò)誤的能力,還在於它能夠引導(dǎo)我們獲得更好、更具表現(xiàn)力的程式碼結(jié)構(gòu)。透過(guò)採(cǎi)用可區(qū)分聯(lián)合和詳盡模式匹配等模式,我們可以創(chuàng)建不僅正確,而且易於閱讀和維護(hù)的程式碼。


我們的創(chuàng)作

一定要看看我們的創(chuàng)作:

投資者中心 | 智能生活 | 時(shí)代與迴響 | 令人費(fèi)解的謎團(tuán) | 印度教 | 精英開(kāi)發(fā) | JS學(xué)校


我們?cè)诿襟w上

科技無(wú)尾熊洞察 | 時(shí)代與迴響世界 | 投資人中央媒體 | 令人費(fèi)解的謎團(tuán) | | 令人費(fèi)解的謎團(tuán) | >科學(xué)與時(shí)代媒介 |

現(xiàn)代印度教

以上是掌握 TypeScript 的模式匹配:提高程式碼的功能和安全性的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

熱門(mén)話(huà)題

Java vs. JavaScript:清除混亂 Java vs. JavaScript:清除混亂 Jun 20, 2025 am 12:27 AM

Java和JavaScript是不同的編程語(yǔ)言,各自適用於不同的應(yīng)用場(chǎng)景。 Java用於大型企業(yè)和移動(dòng)應(yīng)用開(kāi)發(fā),而JavaScript主要用於網(wǎng)頁(yè)開(kāi)發(fā)。

JavaScript評(píng)論:簡(jiǎn)短說(shuō)明 JavaScript評(píng)論:簡(jiǎn)短說(shuō)明 Jun 19, 2025 am 12:40 AM

JavascriptconcommentsenceenceEncorenceEnterential gransimenting,reading and guidingCodeeXecution.1)單inecommentsareusedforquickexplanations.2)多l(xiāng)inecommentsexplaincomplexlogicorprovideDocumentation.3)

如何在JS中與日期和時(shí)間合作? 如何在JS中與日期和時(shí)間合作? Jul 01, 2025 am 01:27 AM

JavaScript中的日期和時(shí)間處理需注意以下幾點(diǎn):1.創(chuàng)建Date對(duì)像有多種方式,推薦使用ISO格式字符串以保證兼容性;2.獲取和設(shè)置時(shí)間信息可用get和set方法,注意月份從0開(kāi)始;3.手動(dòng)格式化日期需拼接字符串,也可使用第三方庫(kù);4.處理時(shí)區(qū)問(wèn)題建議使用支持時(shí)區(qū)的庫(kù),如Luxon。掌握這些要點(diǎn)能有效避免常見(jiàn)錯(cuò)誤。

為什麼要將標(biāo)籤放在的底部? 為什麼要將標(biāo)籤放在的底部? Jul 02, 2025 am 01:22 AM

PlacingtagsatthebottomofablogpostorwebpageservespracticalpurposesforSEO,userexperience,anddesign.1.IthelpswithSEObyallowingsearchenginestoaccesskeyword-relevanttagswithoutclutteringthemaincontent.2.Itimprovesuserexperiencebykeepingthefocusonthearticl

JavaScript與Java:開(kāi)發(fā)人員的全面比較 JavaScript與Java:開(kāi)發(fā)人員的全面比較 Jun 20, 2025 am 12:21 AM

JavaScriptIspreferredforredforwebdevelverment,而Javaisbetterforlarge-ScalebackendsystystemsandSandAndRoidApps.1)JavascriptexcelcelsincreatingInteractiveWebexperienceswebexperienceswithitswithitsdynamicnnamicnnamicnnamicnnamicnemicnemicnemicnemicnemicnemicnemicnemicnddommanipulation.2)

JavaScript:探索用於高效編碼的數(shù)據(jù)類(lèi)型 JavaScript:探索用於高效編碼的數(shù)據(jù)類(lèi)型 Jun 20, 2025 am 12:46 AM

javascripthassevenfundaMentalDatatypes:數(shù)字,弦,布爾值,未定義,null,object和symbol.1)numberSeadUble-eaduble-ecisionFormat,forwidevaluerangesbutbecautious.2)

什麼是在DOM中冒泡和捕獲的事件? 什麼是在DOM中冒泡和捕獲的事件? Jul 02, 2025 am 01:19 AM

事件捕獲和冒泡是DOM中事件傳播的兩個(gè)階段,捕獲是從頂層向下到目標(biāo)元素,冒泡是從目標(biāo)元素向上傳播到頂層。 1.事件捕獲通過(guò)addEventListener的useCapture參數(shù)設(shè)為true實(shí)現(xiàn);2.事件冒泡是默認(rèn)行為,useCapture設(shè)為false或省略;3.可使用event.stopPropagation()阻止事件傳播;4.冒泡支持事件委託,提高動(dòng)態(tài)內(nèi)容處理效率;5.捕獲可用於提前攔截事件,如日誌記錄或錯(cuò)誤處理。了解這兩個(gè)階段有助於精確控制JavaScript響應(yīng)用戶(hù)操作的時(shí)機(jī)和方式。

See all articles