溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

什么是TypeScript索引簽名

發(fā)布時間:2021-10-15 13:35:28 來源:億速云 閱讀:421 作者:iii 欄目:開發(fā)技術

本篇內容主要講解“什么是TypeScript索引簽名”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“什么是TypeScript索引簽名”吧!

目錄
  • 1.什么是索引簽名

  • 2. 索引簽名語法

  • 3. 索引簽名的注意事項

    • 3.1不存在的屬性

    • 3.2 string 和 number 鍵

  • 4.索引簽名與 Record<Keys, Type>對比

    我們用兩個對象來描述兩個碼農的工資:

    const salary1 = {
      baseSalary: 100_000,
      yearlyBonus: 20_000
    };
     
    const salary2 = {
      contractSalary: 110_000
    };

    然后寫一個獲取總工資的函數(shù)

    function totalSalary(salaryObject: ???) {
      let total = 0;
      for (const name in salaryObject) {
        total += salaryObject[name];
      }
      return total;
    }
    totalSalary(salary1); // => 120_000
    totalSalary(salary2); // => 110_000

    如果是你的,要如何聲明totalSalary()函數(shù)的salaryObject參數(shù),以接受具有字符串鍵和數(shù)字值的對象?

    答案是使用一個索引簽名!

    接著,我們來看看什么是 TypeScript 索引簽名以及何時需要它們。

    1.什么是索引簽名

    索引簽名的思想是在只知道鍵和值類型的情況下對結構未知的對象進行類型劃分。

    它完全符合salary參數(shù)的情況,因為函數(shù)應該接受不同結構的salary對象,唯一的要求是屬性值為數(shù)字。

    我們用索引簽名來聲明salaryObject參數(shù)

    function totalSalary(salaryObject: { [key: string]: number }) {
      let total = 0;
      for (const name in salaryObject) {
        total += salaryObject[name];
      }
      return total;
    }
     
    totalSalary(salary1); // => 120_000
    totalSalary(salary2); // => 110_000

    {[key: string]: number} 是索引簽名,它告訴TypeScript salaryObject 必須是一個以string 類型為鍵,以 number 類型為值的對象。

    2. 索引簽名語法

    索引簽名的語法相當簡單,看起來與屬性的語法相似,但有一點不同。我們只需在方括號內寫上鍵的類型,而不是屬性名稱:{ [key: KeyType]: ValueType }。

    下面是一些索引簽名的例子。

    string 類型是鍵和值。

    interface StringByString {
      [key: string]: string;
    }
     
    const heroesInBooks: StringByString = {
      'Gunslinger': '前端小智',
      'Jack Torrance': '王大志'
    };

    string 類型是鍵,值可以是 stringnumberboolean

    interface Options {
      [key: string]: string | number | boolean;
      timeout: number;
    }
     
    const options: Options = {
      timeout: 1000,
      timeoutMessage: 'The request timed out!',
      isFileUpload: false
    };

    簽名的鍵只能是一個 string`、numbersymbol`。其他類型是不允許的。

    什么是TypeScript索引簽名

    3. 索引簽名的注意事項

    TypeScript中的索引簽名有一些注意事項,需要注意。

    3.1不存在的屬性

    如果試圖訪問一個索引簽名為 { [key: string]: string } 的對象的一個不存在的屬性,會發(fā)生什么?

    正如預期的那樣,TypeScript 將值的類型推斷為 string。但是檢查運行時值,它是undefined:

    什么是TypeScript索引簽名

    根據 TypeScript 提示, value變量是一個 string 類型,但是它的運行時值是 undefined。

    索引簽名只是將一個鍵類型映射到一個值類型,僅此而已。如果沒有使這種映射正確,值類型可能會偏離實際的運行時數(shù)據類型。

    為了使輸入更準確,將索引值標記為 string undefined。這樣,TypeScript就會意識到你訪問的屬性可能不存在

    什么是TypeScript索引簽名

    3.2 string 和 number 鍵

    假設有一個數(shù)字名稱的字典:

    interface NumbersNames {
      [key: string]: string
    }
     
    const names: NumbersNames = {
      '1': 'one',
      '2': 'two',
      '3': 'three',
      // ...
    };

    什么是TypeScript索引簽名

    不會,正常工作。

    當在屬性訪問器中作為鍵使用時,JavaScript隱式地將數(shù)字強制為字符串(names[1]names['1']相同)。TypeScript也會執(zhí)行這個強制。

    你可以認為 [key: string] 與 [key: string | number] 相同。

    4.索引簽名與 Record<Keys, Type>對比

    TypeScript有一個實用類型 Record<Keys, Type>,類似于索引簽名。

    const object1: Record<string, string> = { prop: 'Value' }; // OK
    const object2: { [key: string]: string } = { prop: 'Value' }; // OK

    那問題來了...什么時候使用 Record<Keys, Type>,什么時候使用索引簽名?乍一看,它們看起來很相似

    我們知道,索引簽名只接受 string、number symbol 作為鍵類型。如果你試圖在索引簽名中使用,例如,字符串字面類型的聯(lián)合作為鍵,這是一個錯誤。

    什么是TypeScript索引簽名

    索引簽名在鍵方面是通用的。

    但是我們可以使用字符串字面值的聯(lián)合來描述 Record<keys, Type>中的鍵

    type Salary = Record<'yearlySalary'|'yearlyBonus', number>
     
    const salary1: Salary = { 
      'yearlySalary': 120_000,
      'yearlyBonus': 10_000
    }; // OK

    Record<Keys, Type> 是為了具體到鍵的問題。

    建議使用索引簽名來注釋通用對象,例如,鍵是字符串類型。但是,當你事先知道鍵的時候,使用Record<Keys, Type>來注釋特定的對象,例如字符串字面量' prop1' | 'prop2'被用于鍵值。

     總結:

    如果你不知道你要處理的對象結構,但你知道可能的鍵和值類型,那么索引簽名就是你需要的。

    索引簽名由方括號中的索引名稱及其類型組成,后面是冒號和值類型: { [indexName: KeyType]: ValueType }, KeyType 可以是一個 string、number symbol,而ValueType 可以是任何類型。

    到此,相信大家對“什么是TypeScript索引簽名”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!

    向AI問一下細節(jié)

    免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI