<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 2716字,需瀏覽 6分鐘

           ·

          2021-08-12 18:29

          ?

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

          原文: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 類型來說, 它的約束是很寬松的. 在一些應用場景中, 我們除了希望能支持動態(tài)的屬性之外, 也希望能夠聲明一些必選和可選的屬性.

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

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

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

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

          • 其實除了使用 索引簽名 之外, 我們也可以使用 TypeScript 內置的工具類型 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`

          關注公眾號添加鬼哥微信,和鬼哥一起學習

          ?? 看完三件事

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

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

          • 點擊↓面關注我們,一起學前端

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



          瀏覽 155
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

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

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美黄片在线视频 | 亚洲高清无码视频大全 | 激情乱伦无码 | 午夜爽爽 | 成人免费黄色片 |