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

一篇文章讓你搞懂TypeScript中的typeof()、keyof()是什么意思

這篇具有很好參考價(jià)值的文章主要介紹了一篇文章讓你搞懂TypeScript中的typeof()、keyof()是什么意思。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

知識(shí)回調(diào)(不懂就看這兒!)

知識(shí)專(zhuān)欄 專(zhuān)欄鏈接
TypeScript知識(shí)專(zhuān)欄 https://blog.csdn.net/xsl_hr/category_12030346.html?spm=1001.2014.3001.5482

一篇文章讓你搞懂TypeScript中的typeof()、keyof()是什么意思

有關(guān)TypeScript的相關(guān)知識(shí)可以前往TypeScript知識(shí)專(zhuān)欄查看復(fù)習(xí)??!

場(chǎng)景復(fù)現(xiàn)

最近在前端的深入學(xué)習(xí)過(guò)程中,接觸了與網(wǎng)絡(luò)請(qǐng)求相關(guān)的內(nèi)容,于是計(jì)劃用三個(gè)專(zhuān)欄(HTTP、AxiosAjax)和零碎文章總結(jié)記錄最近的學(xué)習(xí)筆記。由于項(xiàng)目前端技術(shù)棧的腳本語(yǔ)言為TypeScript,在研讀小程序異步請(qǐng)求封裝部分的代碼時(shí),碰到了幾個(gè)關(guān)于TypeScript的小知識(shí)點(diǎn)不太清楚。

問(wèn)題代碼截圖:
一篇文章讓你搞懂TypeScript中的typeof()、keyof()是什么意思

因此,本文以 TypeScript中的typeof()、keyof() 為主要內(nèi)容展開(kāi)講解。

核心干貨??????

舉例引入

在使用TypeScript的時(shí)候,我們經(jīng)常會(huì)類(lèi)似下面的例子一樣編寫(xiě)代碼:??????

// 定義一個(gè)枚舉類(lèi)型的對(duì)象
enum ColorsEnum {
    white = '#ffffff',
    black = '#000000',
}
// 定義Colors類(lèi)型 里面的值只能是ColorsEnum中的值
type Colors = keyof typeof ColorsEnum;

最后一行代碼等價(jià)于:

type Colors = "white" | "black" // Colors的值只能是“white”和“black”中的一個(gè)

那么其中keyof typeof是如何工作的呢?下面我們開(kāi)始切入正題,開(kāi)始詳細(xì)講述。


想要理解TypeScript里的keyof typeof是如何工作的,首先需要理解什么是“字面量類(lèi)型(literal types)”和“聯(lián)合字面量類(lèi)型(union of literal types)”,下面我們來(lái)解釋一下這兩個(gè)概念,再來(lái)詳細(xì)介紹keyoftypeof,最后回到enum來(lái)回答上面的問(wèn)題。

字面量類(lèi)型(literal types)

Typescript 中的字面量類(lèi)型是更具體的 string, numberboolean 類(lèi)型。比如 "Hello World" 是一個(gè) string,但是 string 類(lèi)型不是 "Hello World""Hello World"string 類(lèi)型的一個(gè)更具體的類(lèi)型,所以它是一個(gè)字面量類(lèi)型。

一個(gè)字面型變量可以這樣被定義:

type Greeting = "Hello"

這意味著 Greeting 類(lèi)型的對(duì)象只能有一個(gè)字符串值 "Hello",并且沒(méi)有其他 string 類(lèi)型的值,或者其他任何類(lèi)型的值,就像是下面代碼說(shuō)的一樣:

let greeting: Greeting
greeting = "Hello" // OK
greeting = "Hi"    // Error: Type '"Hi"' is not assignable to type '"Hello"'

字面量類(lèi)型本身并不是很有用,但是當(dāng)它和聯(lián)合類(lèi)型(union types)、類(lèi)型別名(type aliases)、類(lèi)型保護(hù)(type guards)組合起來(lái)后,它就會(huì)變得很強(qiáng)大。

下面是聯(lián)合字面量類(lèi)型的例子:??????

type Greeting = "Hello" | "Hi" | "Welcome"

現(xiàn)在 Greeting 類(lèi)型對(duì)象的值可以是 "Hello", "Hi" 或者 "Welcome"

let greeting: Greeting
greeting = "Hello"       // OK
greeting = "Hi"          // OK
greeting = "Welcome"     // OK
greeting = "GoodEvening" // Error: Type '"GoodEvening"' is not assignable to type 'Greeting'

keyof單獨(dú)使用

假設(shè)現(xiàn)在有一個(gè)類(lèi)型 T(泛型),keyof T 將會(huì)給你一個(gè)新類(lèi)型,它是我們前面提到的聯(lián)合字面量類(lèi)型,并且組成它的字面量類(lèi)型是 T 的屬性名稱(chēng)。最后生成的類(lèi)型是字符串的子類(lèi)型。

比如來(lái)看下下面的 interface:??????

interface Person {
    name: string
    age: number
    location: string
}

在 Person 類(lèi)型上使用 keyof,將會(huì)得到一個(gè)新類(lèi)型,如下面代碼所示:??????

type SomeNewType = keyof Person

SomeNewType 是一個(gè)聯(lián)合字面量類(lèi)型("name" | "age" | "location"),它是由 Person 的屬性組成的類(lèi)型。

現(xiàn)在,你可以創(chuàng)建 SomeNewType 類(lèi)型的對(duì)象了:??????

let newTypeObject: SomeNewType

newTypeObject = "name"           // OK
newTypeObject = "age"            // OK
newTypeObject = "location"       // OK
newTypeObject = "anyOtherValue"  // Error...Type '"anyOtherValue"' is not assignable to type 'keyof Person'

keyof typeof同時(shí)使用

typeof 運(yùn)算符為你提供對(duì)象的類(lèi)型,上面例子中 Person interface,我們已經(jīng)知道它的類(lèi)型,所以我們只需要在 Person 上使用 keyof 操作符。
但是,當(dāng)我們不知道對(duì)象的類(lèi)型,或者我們只有一個(gè)值,類(lèi)似于下面的情況,應(yīng)該怎么辦呢?

const bmw = { name: "BMW", power: "1000hp" }

這就是我們需要一起使用 keyof typeof 的地方。typeof bmw 給到你他們的類(lèi)型 { name: string, power: string }

接著 keyof 操作符給到你聯(lián)合字面量類(lèi)型,像下面代碼描述的一樣:??????

type CarLiteralType = keyof typeof bmw

let carPropertyLiteral: CarLiteralType
carPropertyLiteral = "name"       // OK
carPropertyLiteral = "power"      // OK
carPropertyLiteral = "anyOther"   // Error...Type '"anyOther"' is not assignable to type '"name" | "power"'

在enum上使用keyof typeof

在 Typescript 中,enum 在編譯時(shí)被用作類(lèi)型,用來(lái)實(shí)現(xiàn)常量的類(lèi)型安全,但是它們?cè)谶\(yùn)行時(shí)被視為對(duì)象。這是因?yàn)椋?em>當(dāng) Typescript 代碼被編譯為 Javascript 時(shí),它們會(huì)被轉(zhuǎn)換為普通對(duì)象。

接著我們回顧一下,最開(kāi)始我們提出問(wèn)題的例子是這樣的:??????

enum ColorsEnum {
    white = '#ffffff',
    black = '#000000',
}

這里 ColorsEnum 在運(yùn)行時(shí)作為一個(gè)對(duì)象存在,不是一個(gè)類(lèi)型,所以,我們需要一起使用 keyof typeof 這兩個(gè)操作符,像下面代碼展示的一樣。

type Colors = keyof typeof ColorsEnum

let colorLiteral: Colors
colorLiteral = "white"  // OK
colorLiteral = "black"  // OK
colorLiteral = "red"    // Error...Type '"red"' is not assignable to type '"white" | "black"'

以上就是關(guān)于==TypeScript中的typeof()、keyof()==的分享,相信看完這篇文章的小伙伴們一定有了一定的收獲。當(dāng)然,可能有不足的地方,歡迎大家在評(píng)論區(qū)留言指正!

感興趣的小伙伴可以訂閱本專(zhuān)欄,方便后續(xù)了解學(xué)習(xí)~
覺(jué)得這篇文章有用的小伙伴們可以點(diǎn)贊?收藏?關(guān)注哦~

一篇文章讓你搞懂TypeScript中的typeof()、keyof()是什么意思文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-420519.html

到了這里,關(guān)于一篇文章讓你搞懂TypeScript中的typeof()、keyof()是什么意思的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(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)文章

  • 一篇文章帶你搞懂GIT、Github、Gitee

    一篇文章帶你搞懂GIT、Github、Gitee

    本文介紹了GIt,GitHub,Gitee的使用,與IDEA的Git配置,跟著文章來(lái)做你很快就能學(xué)會(huì)操作Git,利用其進(jìn)行版本控制與代碼托管,學(xué)習(xí)Git的使用、Git常用命令、Git分支,分支是團(tuán)隊(duì)協(xié)作的基礎(chǔ),介紹了團(tuán)隊(duì)內(nèi),外協(xié)作和Github遠(yuǎn)程倉(cāng)庫(kù)的操作、使用IDEA中的Git、IDEA中GIt的使用、在I

    2023年04月19日
    瀏覽(26)
  • 一篇文章帶你搞懂微信小程序的開(kāi)發(fā)過(guò)程

    一篇文章帶你搞懂微信小程序的開(kāi)發(fā)過(guò)程

    小程序想必大家應(yīng)該都不陌生了吧,今天小編帶大家一起來(lái)學(xué)習(xí)下微信小程序的開(kāi)發(fā)過(guò)程吧。 這個(gè)不一一介紹,網(wǎng)上有教程,申請(qǐng)成功后打開(kāi)后臺(tái),我們找到小程序,下載微信開(kāi)發(fā)者工具,如圖: 這里我們選擇普通小程序開(kāi)發(fā)工具,點(diǎn)擊微信開(kāi)發(fā)者工具,如圖: 然后選擇相

    2024年02月09日
    瀏覽(26)
  • 一篇文章帶你搞懂動(dòng)態(tài)規(guī)劃(由暴力遞歸到動(dòng)態(tài)規(guī)劃)

    一篇文章帶你搞懂動(dòng)態(tài)規(guī)劃(由暴力遞歸到動(dòng)態(tài)規(guī)劃)

    ”動(dòng)態(tài)規(guī)劃“ 的過(guò)程相當(dāng)于 記憶化搜索 , 即在普通 遞歸 的過(guò)程中用二維數(shù)組進(jìn)行記憶化存儲(chǔ)一些狀態(tài)結(jié)果, 從而避免重復(fù)的計(jì)算(剪枝)。 舉一個(gè)簡(jiǎn)單的例子:在 遞歸法 求解 斐波那契 數(shù)列的過(guò)程中, 就進(jìn)行了多次的 重復(fù)計(jì)算 , 而動(dòng)態(tài)規(guī)劃相當(dāng)于是對(duì)已經(jīng)計(jì)算的狀態(tài)

    2024年02月20日
    瀏覽(24)
  • 顛覆世界的“數(shù)字孿生”到底是什么?這篇文章帶你搞懂全部?jī)?nèi)涵!

    顛覆世界的“數(shù)字孿生”到底是什么?這篇文章帶你搞懂全部?jī)?nèi)涵!

    在春節(jié)很火的電影《流浪地球2》中,已經(jīng)去世的小女孩圖丫丫,被她的父親重新將其個(gè)人的信息模型導(dǎo)入最強(qiáng)大的計(jì)算機(jī)而“復(fù)活”了。屏幕中的丫丫就是一個(gè)數(shù)字孿生體。我們可以看到她的一顰一笑,聽(tīng)到她跟你的對(duì)話,看到她做出反應(yīng)。這就是數(shù)字孿生的另一特色,數(shù)字

    2024年02月01日
    瀏覽(43)
  • 一篇文章帶你搞懂spring6的概念、spring入門(mén)與容器IoC詳解(尚硅谷筆記)

    一篇文章帶你搞懂spring6的概念、spring入門(mén)與容器IoC詳解(尚硅谷筆記)

    Spring 是一款主流的 Java EE 輕量級(jí)開(kāi)源框架 ,Spring 由“Spring 之父”Rod Johnson 提出并創(chuàng)立,其目的是用于簡(jiǎn)化 Java 企業(yè)級(jí)應(yīng)用的開(kāi)發(fā)難度和開(kāi)發(fā)周期。Spring的用途不僅限于服務(wù)器端的開(kāi)發(fā)。從簡(jiǎn)單性、可測(cè)試性和松耦合的角度而言,任何Java應(yīng)用都可以從Spring中受益。Spring 框架

    2023年04月16日
    瀏覽(25)
  • 【運(yùn)維知識(shí)高級(jí)篇】一篇文章帶你搞懂Git?。℅it安裝+全局配置+Git初始化代碼倉(cāng)庫(kù)+Git四大區(qū)域+Git四種狀態(tài)+Git常用命令+Git分支+Git測(cè)試代碼回滾)

    版本流程控制系統(tǒng)(version control system)是一種記錄一個(gè)或若干個(gè)文件內(nèi)容變化,以便將來(lái)查閱特定版本內(nèi)容情況的系統(tǒng),它會(huì)記錄文件的所有歷史變化,我們可以隨時(shí)恢復(fù)到任何一個(gè)歷史狀態(tài),同時(shí)支持多人協(xié)作開(kāi)發(fā)。 目錄 常見(jiàn)的版本管理工具 Git安裝與全局配置 Git初始化

    2024年02月02日
    瀏覽(140)
  • C語(yǔ)言數(shù)據(jù)在內(nèi)存中的存續(xù):一篇文章讓你秒懂基礎(chǔ)!

    C語(yǔ)言數(shù)據(jù)在內(nèi)存中的存續(xù):一篇文章讓你秒懂基礎(chǔ)!

    JAMES別扣了-CSDN博客 ??在校大學(xué)生一枚。對(duì)IT有著極其濃厚的興趣 ?系列專(zhuān)欄目前為C語(yǔ)言初階、后續(xù)會(huì)更新c語(yǔ)言的學(xué)習(xí)方法以及c題目分享. ??希望我的文章對(duì)大家有著不一樣的幫助,歡迎大家關(guān)注我,我也會(huì)回關(guān),大家一起交流一起互動(dòng),感謝大家的多多支持哈! ??歡迎

    2024年04月13日
    瀏覽(25)
  • 一篇文章搞懂Docker、DockerCompose

    一篇文章搞懂Docker、DockerCompose

    大型項(xiàng)目組件較多,運(yùn)行環(huán)境也較為復(fù)雜,部署時(shí)會(huì)碰到一些問(wèn)題: 依賴(lài)關(guān)系復(fù)雜,容易出現(xiàn)兼容性問(wèn)題 開(kāi)發(fā)、測(cè)試、生產(chǎn)環(huán)境有差異 例如一個(gè)項(xiàng)目中,部署時(shí)需要依賴(lài)于node.js、Redis、RabbitMQ、MySQL等,這些服務(wù)部署時(shí)所需要的函數(shù)庫(kù)、依賴(lài)項(xiàng)各不相同,甚至?xí)袥_突。給部

    2024年01月18日
    瀏覽(26)
  • 一篇文章搞懂Git與Github

    一篇文章搞懂Git與Github

    Git 是一個(gè)開(kāi)源的 分布式版本控制系統(tǒng) ,Github 是 全球最大的同性交友網(wǎng)站 基于 Git 的 代碼托管平臺(tái) ,因?yàn)橹恢С?Git 作為 唯一的版本庫(kù) 格式進(jìn)行托管,故名 GitHub,就是一個(gè)平臺(tái)上面有無(wú)數(shù)個(gè) Git 倉(cāng)庫(kù)——Git 版的百度云,承擔(dān)存儲(chǔ)遠(yuǎn)程倉(cāng)庫(kù)的作用。 唯一版本庫(kù)是什么意思?

    2024年02月06日
    瀏覽(24)
  • 一篇文章搞懂華為的ACL

    一篇文章搞懂華為的ACL

    隨著網(wǎng)絡(luò)的飛速發(fā)展,網(wǎng)絡(luò)安全問(wèn)題日益突出。訪問(wèn)控制列表 (ACL, Access Control List) 可以通過(guò)對(duì)網(wǎng)絡(luò)中報(bào)文流的精確識(shí)別,與其他技術(shù)結(jié)合,達(dá)到控制網(wǎng)絡(luò)訪問(wèn)行為、防止網(wǎng)絡(luò)攻擊和提高網(wǎng)絡(luò)帶寬利用率的目的,從而切實(shí)保障網(wǎng)絡(luò)環(huán)境的安全性和網(wǎng)絡(luò)服務(wù)質(zhì)量的可靠性。 訪問(wèn)

    2024年02月06日
    瀏覽(20)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包