1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        TypeScript: 如何為對象動態(tài)分配屬性

        共 2716字,需瀏覽 6分鐘

         ·

        2021-08-12 18:29

        ?

        鬼哥本周將通過幾篇優(yōu)秀的Typescript文章,讓大家學(xué)習(xí)到Typescript一些高級的用法,讓大家對Typescript更加的深入理解,并且更好實踐到工作當(dāng)中,【一共五篇文章】,關(guān)注我們一起完成這個系列的學(xué)習(xí)

        原文:https://github.com/leslie1943

        ?
        • 在JavaScript中我們很容易給對象動態(tài)添加屬性
        let developer = {}
        developer.name = 'frontender'  
        • 以上代碼在 JavaScript 中可以正常運行, 但在 TypeScript 中, 編譯器會提示以下異常信息
        Property 'name' does not exist on type '{}'.ts(2339)

        ?????? 使用 索引簽名

        • {}類型表示一個沒有包含成員的對象, 所以該類型沒有包含name屬性. 為了解決這個問題, 我們可以聲明一個 LooseObject類型
        interface LooseObject {
          [key: string]: any
        }

        let developer: LooseObject = {}
        developer.name = 'finder'
        • 該類型使用 索引簽名 的形式描述 LooseObject 類型可以接收 key 類型是字符串, 值的類型是any類型的字段. 有了LooseObject類型之后, 我們就可以通過上述代碼解決動態(tài)添加屬性的問題

        • 對于 LooseObject 類型來說, 它的約束是很寬松的. 在一些應(yīng)用場景中, 我們除了希望能支持動態(tài)的屬性之外, 也希望能夠聲明一些必選和可選的屬性.

        • 比如對于一個表示開發(fā)者的 Developer 接口來說, 我們希望它的 name 屬性是必填, 而 age 屬性是可選的, 此外還支持動態(tài)地設(shè)置字符串類型的屬性. 針對這個需求我們可以這樣做

        interface LooseStaticObject {
          name: string
          age?: number
          [key: string]: any
        }

        let coder: LooseStaticObject = { name'semlinker' }
        coder.age = 30
        coder.city = 'Dalian'

        ?????? 使用工具類型 Record 定義接口

        • 其實除了使用 索引簽名 之外, 我們也可以使用 TypeScript 內(nèi)置的工具類型 Record 來定義 Developer 接口
        // type Record<K extends string | number | symbol, T> = { [P in K]: T; }
        // { [P in K]: T } : 屬性名稱是 string |number | symbol 之一(下面代碼中的 string), 屬性值是 T 類型(下面代碼中的any)

        // <K, T>: K 是指屬性的類型; T 是指屬性的值類型 any指任意類型

        interface Developer extends Record<string, any> {
          name: string
          age?: number
        }

        let developer: Developer = { name'coder'1'1' }
        developer.age = 22
        developer.city = 'Dalian'

        // Record<K,T>中的 ?? T 是 string, Value 只能是 string
        interface Coder extends Record<string, string> {
          name: string
          age?: string // 只能是 string
        }
        let coder: Coder = { name'coder' }
        // coder.age = 22 // Type 'number' is not assignable to type 'string'.ts(2322)
        coder.age = `22`

        關(guān)注公眾號添加鬼哥微信,和鬼哥一起學(xué)習(xí)

        ?? 看完三件事

        如果你覺得這篇內(nèi)容對你挺有啟發(fā),不妨:

        • 點個【在看】,或者分享轉(zhuǎn)發(fā),讓更多的人也能看到這篇內(nèi)容

        • 點擊↓面關(guān)注我們,一起學(xué)前端

        • 長按↓面二維碼,添加鬼哥微信,一起學(xué)前端



        瀏覽 155
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            色戒完整版在线观看免费视频电影 | 欧美在线不卡视频 | 日日操日日操 | 西西4444WWW大胆无视频 | 国产特黄太AAAAA片手机放 | 精品人妻人人操 | 欧美一级黃色A片韩国 | 女人扒开腿让男人捅 | 国产女人18毛片水真多1kt∧ | 成人国产精品人妻人伦a 6 2v久 欧美午夜福利在线观看 |