国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

在 TypeScript 中有效地使用 keyof 和 typeof 來(lái)表示類型

這篇具有很好參考價(jià)值的文章主要介紹了在 TypeScript 中有效地使用 keyof 和 typeof 來(lái)表示類型。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

在本文中,我們將學(xué)習(xí)如何通過(guò)組合類型運(yùn)算符和枚舉來(lái)提取和聲明常量類型typeof,以使您的代碼庫(kù)得到優(yōu)化。keyof

先決條件

為了獲得更好的編碼體驗(yàn),您應(yīng)該在 IDE 中安裝 TypeScript,例如VSCode。它將為您提供許多基本功能,例如錯(cuò)誤突出顯示、IntelliSense、linting 等...您還應(yīng)該安裝一些擴(kuò)展,例如JavaScript 和 TypeScript Nightly、ESLint等。

什么是typeof

在 TypeScript 中,我們可以用來(lái)typeof提取變量或?qū)傩缘念愋?,如下例所示?

``` const Name = { firstName: 'Maya', lastName: 'Shavin' };

let myName: typeof Name; ```

在上面的代碼中,我們使用myName從變量 中提取的類型來(lái)聲明變量Name,這將是一個(gè)具有兩個(gè)屬性 -firstName和 的對(duì)象lastName。當(dāng)鼠標(biāo)懸停myName在 IDE 中時(shí),TypeScript 將向您顯示myName結(jié)論的類型Name,如以下屏幕截圖所示:

在 TypeScript 中有效地使用 keyof 和 typeof 來(lái)表示類型

這里注意typeof,如果要提取類型的變量是一個(gè) Object,那么接收到的類型將是一個(gè)完整的類型結(jié)構(gòu),并且每個(gè)屬性都有其類型(例如 type of 將有myName兩個(gè)字段 -?firstNameof typestringlastNameof kind?string)。

另一個(gè)有價(jià)值的場(chǎng)景typeof是將其與ReturnType從函數(shù)中提取返回?cái)?shù)據(jù)的類型結(jié)合起來(lái)。為此,我們執(zhí)行以下操作:

  1. 使用以下方法獲取聲明函數(shù)的函數(shù)類型typeof
  2. 使用ReturnType<T>withT是步驟 1 中提取的類型來(lái)獲取 from 的返回值類型T。

下面的例子演示了如何提取返回類型decoupleName()

``` function decoupleName (name: string) { const [firstName, ...remaining] = name.split(" ");

return {
    firstName,
    lastName: remaining.reduce((text, word) => text ? `${text} ${word}` : word, '')
}

}

type NameObj = ReturnType ```

TypeScript 將自動(dòng)引用正確的類型NameObj,如下面的屏幕截圖所示:

在 TypeScript 中有效地使用 keyof 和 typeof 來(lái)表示類型

此外,我們可以typeof在 TypeScript 中用作條件塊內(nèi)的類型保護(hù),就像在 JavaScript 中一樣,盡管在這種情況下,它主要適用于string、object、function等基本類型...

現(xiàn)在我們了解了typeof它的用法。接下來(lái)我們就來(lái)探討一下keyof

理解keyof

雖然typeof生成由變量表示的類型,但keyof采用對(duì)象類型并生成作為該變量鍵的自由聯(lián)合的類型,如下所示:

``` interface User { firstName: string; lastName: string; };

type UserKeys = keyof User ```

以上等同于以下聲明:

type UserKeys = "firstName" | "lastName"

但是,與 不同的是typeof,您不能keyof直接在變量上使用。對(duì)于以下代碼,TypeScript 將引發(fā)錯(cuò)誤:

``` const Name = { firstName: 'Maya', lastName: 'Shavin' };

type NameKeys = keyof Name; //error ```

要從對(duì)象變量(例如常量值的對(duì)象映射)中提取類型,我們需要結(jié)合keyoftypeof,我們接下來(lái)將學(xué)習(xí)這一點(diǎn)。

從對(duì)象的鍵(或?qū)傩?中提取typeOf

以下面的ImageVariables為例,它充當(dāng)修改圖像時(shí)使用的變量的映射:

export const ImageVariables = { width: 'w', height: 'h', aspectRatio: 'ar', rotate: 'a', opacity: 'o', } as const;

請(qǐng)注意,這里我們需要const對(duì)象末尾的 來(lái)將其指示為只讀。否則,TypeScript 將不允許我們從中提取類型,因?yàn)榇嬖陔S時(shí)修改對(duì)象內(nèi)部屬性的風(fēng)險(xiǎn)。

ImageVariables包含從其鍵到根據(jù)Cloudinary 機(jī)制轉(zhuǎn)換圖像時(shí)使用的匹配變量符號(hào)的映射。要根據(jù) 的屬性(或鍵)生成類型ImageVariables,我們執(zhí)行以下操作:

  1. ImageVariables獲取代表使用的類型typeof

type ImageVariablesType = typeof ImageVariables

  1. 根據(jù)類型的鍵提取新類型ImageVariablesType,使用keyof

type ImageFields = keyof ImageVariablesType

或者,我們可以將上述兩個(gè)步驟合二為一,如下所示:

type ImageFields = keyof typeof ImageVariables

就是這樣。我們現(xiàn)在有了ImageFieldstype,其中包含 的接受字段ImageVariables,如下面的屏幕截圖所示:

在 TypeScript 中有效地使用 keyof 和 typeof 來(lái)表示類型

我們現(xiàn)在可以使用這個(gè)生成的類型,如下所示:

``` const transformImage = (field: ImageFields) => { const variable = ImageVariables[field]

//do something with it

} ```

通過(guò)基于 的屬性聲明類型ImageVariables,任何使用 的流程transformImage都是安全的,并且我們可以確保field傳遞的內(nèi)容始終需要存在于 中ImageVariables。否則,TypeScript 將檢測(cè)任何錯(cuò)誤并向用戶發(fā)出警報(bào)。

在 TypeScript 中有效地使用 keyof 和 typeof 來(lái)表示類型

此外,Intellisense 將告知用戶可接受的值,限制傳遞錯(cuò)誤值的可能性。

在 TypeScript 中有效地使用 keyof 和 typeof 來(lái)表示類型

順便說(shuō)一句,類型檢查的行為與hasOwnProperty()運(yùn)行時(shí)檢查類似,盡管它只發(fā)生在編譯時(shí)。

聽(tīng)起來(lái)很簡(jiǎn)單。如果我們想將鍵的值提取到ImageVariables新類型中怎么辦?我們接下來(lái)看一下。

從對(duì)象的鍵(或?qū)傩?的值中提取typeof

如果我們想從 的鍵值生成一個(gè)類型ImageVariables,我們可以執(zhí)行以下操作:

type VariableValues = typeof ImageVariables[ImageFields]

由于我們已經(jīng)聲明ImageVariablesType為 of 類型ImageVariables,因此我們可以將上面的內(nèi)容重寫為:

type VariableValues = ImageVariablesType[ImageFields]

通過(guò)上面的代碼,我們現(xiàn)在有了一個(gè)新類型,VariableValues它接受以下值:

在 TypeScript 中有效地使用 keyof 和 typeof 來(lái)表示類型

從命名常量對(duì)象的值和鍵生成類型在許多情況下都是有利的,例如當(dāng)您必須使用各種數(shù)據(jù)映射并且標(biāo)準(zhǔn)鍵或值在它們之間進(jìn)行映射時(shí)。在對(duì)象映射上使用keyoftypeof可以幫助創(chuàng)建相關(guān)映射和類型之間的連接,從而避免潛在的錯(cuò)誤。

或者,我們可以結(jié)合枚舉 和typeof來(lái)實(shí)現(xiàn)相同的目標(biāo)。

使用枚舉

枚舉是聲明命名常量類型的一種方便且有組織的方式。它允許我們創(chuàng)建一組不同的常量值,并且每個(gè)枚舉字段都是基于數(shù)字或基于字符串的。我們可以重寫我們ImageVariables的如下:

enum EImageVariables { width = 'w', height = 'h', aspectRatio = 'ar', rotate = 'a', opacity = 'o', }

使用枚舉的優(yōu)點(diǎn)之一是我們可以使用枚舉的名稱作為接受值聲明的類型。因此,代替以下代碼:

``` type VariableValues = typeof ImageVariables[ImageFields]

function transform(value: VariableValues) { //perform something } ```

EImageVariables我們可以使用如下方式重寫:

function transform(value: EImageVariables) { //perform something }

對(duì)于更少的代碼,類型檢查執(zhí)行相同的操作。盡管如此,為了從聲明的 enum 的鍵(或?qū)傩?獲取類型,我們?nèi)匀恍枰癯R?guī)常量對(duì)象一樣EImageVariables使用組合:keyof typeof

type ImageFields = keyof typeof EImageVariables

就是這樣。上面的代碼產(chǎn)生的結(jié)果與我們使用ImageVariables.

現(xiàn)在讓我們回顧一下如何從常量對(duì)象的鍵和值獲取類型:

``` export const ImageVariables = { width: 'w', height: 'h', aspectRatio: 'ar', rotate: 'a', opacity: 'o', } as const;

type ImageVariablesType = typeof ImageVariables; type ImageFields = keyof ImageVariablesType; type VariableValues = ImageVariablesType[ImageFields]; ```

與使用枚舉相比:

``` enum EImageVariables { width = 'w', height = 'h', aspectRatio = 'ar', rotate = 'a', opacity = 'o', }

type EImageVariablesType = typeof EImageVariables; type EImageFields = keyof EImageVariablesType; //No need for getting the type of values ```

與常量對(duì)象一樣,我們可以直接使用枚舉鍵的值,例如EImageVariables.width在我們的代碼中。在運(yùn)行時(shí),枚舉作為 JavaScript 對(duì)象存在于編譯后的代碼中,并且表現(xiàn)得像 JavaScript 對(duì)象。

一般來(lái)說(shuō),枚舉是可以的。在 TypeScript 中,由于其實(shí)現(xiàn)方式效率低下(希望這個(gè)問(wèn)題已得到修復(fù)或會(huì)很短),許多人認(rèn)為它對(duì)性能有影響。

那么我們應(yīng)該使用它們嗎?這取決于。這個(gè)選擇由你。

概括

在使用 TypeScript 時(shí),我們經(jīng)常忽略類型運(yùn)算符,例如typeof或 ,keyof因?yàn)樗鼈兲跫?jí)了。然而,它們?cè)跇?gòu)建類型系統(tǒng)中發(fā)揮著重要作用。當(dāng)正確結(jié)合其他 TypeScript 語(yǔ)法時(shí),它們可以幫助您的應(yīng)用程序開(kāi)發(fā)高級(jí)和復(fù)雜的類型。讓我們嘗試一下它們,看看它們能為您帶來(lái)什么。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-512211.html

到了這里,關(guān)于在 TypeScript 中有效地使用 keyof 和 typeof 來(lái)表示類型的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【TypeScript】類型推斷與類型別名的使用方式。

    【TypeScript】類型推斷與類型別名的使用方式。

    什么是類型推斷? 在 TypeScript 中, 如果聲明變量時(shí), 沒(méi)有明確的指定類型 ,那么 TypeScript 會(huì)依照類型推論(Type Inference)的規(guī)則推斷出一個(gè)類型。 以下代碼雖然 沒(méi)有明確指定類型 ,但是會(huì)在編譯的時(shí)候報(bào)錯(cuò): 事實(shí)上,它等價(jià)于: TypeScript 會(huì)在沒(méi)有明確的指定類型的時(shí)候,

    2024年02月16日
    瀏覽(24)
  • TypeScript類型系統(tǒng):強(qiáng)類型的優(yōu)勢(shì)和使用方式

    在上一篇文章《TypeScript入門指南:從JS到TS的轉(zhuǎn)變》 中,已經(jīng)向大家說(shuō)明了 TypeScript 是一種靜態(tài)類型的編程語(yǔ)言,它的 類型系統(tǒng) 是它的重要特性之一。TypeScript 的類型系統(tǒng)可以提供一些強(qiáng)大的優(yōu)勢(shì),可以幫助開(kāi)發(fā)人員編寫 更健壯 、 更可維護(hù) 和 更易于理解 的代碼。 從這一

    2024年02月09日
    瀏覽(22)
  • 【TypeScript】接口類型 Interfaces 的使用理解

    【TypeScript】接口類型 Interfaces 的使用理解

    導(dǎo)語(yǔ) : 什么是 類型接口 ? 在面向?qū)ο笳Z(yǔ)言中 ,接口 (Interfaces) 是一個(gè)很重要的概念,它是對(duì)行為的抽象,而具體如何行動(dòng)需要由類(classes)去實(shí)現(xiàn)(implement)。TypeScript 中的 類型接口 是一個(gè)非常靈活的概念,除了可用于 對(duì)類的一部分行為進(jìn)行抽象 以外,也常用于對(duì)「

    2024年02月15日
    瀏覽(23)
  • js判斷類型:typeof Object.prototype.toString instanceof constructor有什么區(qū)別?一文講清楚

    js判斷類型:typeof Object.prototype.toString instanceof constructor有什么區(qū)別?一文講清楚

    相信很多小伙伴在使用js的過(guò)程中,經(jīng)常會(huì)需要對(duì)js的數(shù)據(jù)類型進(jìn)行判斷,而js中可以對(duì)數(shù)據(jù)類型進(jìn)行判斷的方法有很多種,最常見(jiàn)的有typeof、Object.prototype.toString、instanceof、constructor這四種,那么他們有什么區(qū)別呢? 目錄 js數(shù)據(jù)類型 typeof 為啥typeof會(huì)將null判斷為object Object.pr

    2024年02月11日
    瀏覽(27)
  • Buf 教程 - 使用 Protobuf 生成 Golang 代碼和 Typescript 類型定義

    Buf 教程 - 使用 Protobuf 生成 Golang 代碼和 Typescript 類型定義

    Buf 是一款更高效、開(kāi)發(fā)者友好的 Protobuf API 管理工具,不僅支持代碼生成,還支持插件和 Protobuf 格式化。 我們可以使用 Buf 替代原本基于 Protoc 的代碼生成流程,一方面可以統(tǒng)一管理團(tuán)隊(duì) Protoc 插件的版本、代碼生成配置,另一方面可以簡(jiǎn)化項(xiàng)目開(kāi)發(fā)配置。 本文將會(huì)用兩部分

    2024年02月08日
    瀏覽(47)
  • html從零開(kāi)始10:注釋與常見(jiàn)輸出方式,數(shù)據(jù)類型,typeof運(yùn)算符,運(yùn)算符之算術(shù)、賦值、比較、布爾運(yùn)算符【搬代碼】
  • TypeScript 聯(lián)合類型,類型推斷,類型斷言

    取值可以為多種類型中的一個(gè) 當(dāng)變量需要調(diào)用某屬性的時(shí)候,有不確定當(dāng)前的類型是什么,可以使用類型斷言; 類型斷言的兩種方式: 1,類型 變量名; 2,值 as 類型; 沒(méi)有明確的指定類型的情況下推斷出一個(gè)類型;

    2024年02月15日
    瀏覽(28)
  • TypeScript高級(jí)類型:聯(lián)合類型、交叉類型和類型別名

    TypeScript 是一門強(qiáng)類型語(yǔ)言,其高級(jí)類型功能使得開(kāi)發(fā)者能夠更加靈活地定義類型并對(duì)其進(jìn)行操作,以便于更好地編寫可維護(hù)和可擴(kuò)展的代碼。 在本文中,將著重討論三種高級(jí)類型:聯(lián)合類型、交叉類型和類型別名。我們將詳細(xì)介紹這些類型,并且還會(huì)提供一些有用的代碼示

    2024年02月10日
    瀏覽(40)
  • Typescript的類型推導(dǎo)與聯(lián)合類型

    考慮以下 TypeScript 代碼片段: 1、請(qǐng)解釋 processInput 函數(shù)的作用和輸入?yún)?shù)的類型。 2、解釋變量 example1 和 example2 的類型注解。 3、描述 TypeScript 在調(diào)用 processInput(example1) 和 processInput(example2) 時(shí)是如何進(jìn)行類型推導(dǎo)的。 解答: 1、processInput 函數(shù)接受一個(gè)參數(shù) input,該參數(shù)的類

    2024年01月21日
    瀏覽(21)
  • 數(shù)據(jù)結(jié)構(gòu)與算法之字符串: Leetcode 20. 有效的括號(hào) (Typescript版)

    有效的括號(hào) https://leetcode.cn/problems/valid-parentheses/ 描述 給定一個(gè)只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判斷字符串是否有效。 有效字符串需滿足: 左括號(hào)必須用相同類型的右括號(hào)閉合。 左括號(hào)必須以正確的順序閉合。 每個(gè)右括號(hào)都有一個(gè)對(duì)應(yīng)的相

    2024年02月01日
    瀏覽(22)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包