ts 聲明二維數(shù)組,key可為string 或任意類型

文章內(nèi)容:

  1. 普通二維數(shù)組的定義
  2. key 可為任意類型的二維數(shù)組
  3. 解決對象使用 [變量] 的調(diào)用方式報錯的問題,通常是發(fā)生在函數(shù)中調(diào)用
1. 普通二維數(shù)組的定義

常用的有兩種方式:

// 方式一
let arry: number[][] = [[1,2,3]];
//方式二
let arry: Array<Array<number>> = [[1,2,3]];

number[][] 和 Array<Array<number>> 在解讀字面意義上是剛好相反的:

  • number[][] : 是從右到左進行解析,也就是,有一個外層數(shù)組(最右邊的中括號[] ),該外層中括號數(shù)組包含的類型是number[];接著對number[] 進行解析,也是從右到左的,聲明了一個數(shù)組([]),該數(shù)組的類型值為number。
    合起來解析就是:一個數(shù)組內(nèi)的元素是數(shù)組,而內(nèi)部數(shù)組的元素是number 類型。

  • 同理,對于Array<Array<number>> 的解析是從左到右的,從字面上看也是非常直觀的。

注意: 不管是number[][] 還是 Array<Array<number>>,他們的下標key都是 number 類型,這點需要注意。
也就是 我們在取值時,只能 arry[1][0] ,下標key 都只能是 number 類型否則會報錯。解決方法可以看下面的2

2. key 可為任意類型的二維數(shù)組

需要注意我們使用 1 中的普通二維數(shù)組,取值時,下標key 只能是 number?,F(xiàn)在講解 key 可為任意類型的二維數(shù)組。

  • 通過定義接口屬性來解決 key 為任何值
interface ArrayKeyAny {
  [key: any]: any   // 根據(jù)需要,可把key 和 value 類型設(shè)置成指定的類型
}
// 定義二維數(shù)組
let array: Array<ArrayKeyAny> = [ [ "123" : 123 ] ]
let array: ArrayKeyAny[] = [ [ "123" : 123 ] ]
// 注意: 上面的定義,只有內(nèi)層數(shù)組的 key 是可以是類型,外層的依然是 number 
3. 解決對象使用 [變量] 的調(diào)用方式報錯的問題,通常是發(fā)生在函數(shù)中調(diào)用

在 ts 中 對象(不定義[key: string],見下)是不允許使用 [ 變量 ] 的方式進行取值的,只能使用 . 操作符,但若我們必須使用 [變量] 進行對對象取值。有以下方法:

  1. 使用 keyof 抽取 對象的 key 組成聯(lián)合類型
interface Obj {
  item1 : string,
  item2: number,
  // [key: string]: string |number
}
let a: Obj = {
  item1:"123",
  item2:1234
}

let key= "item1"  // 沒有給 key 的類型進行定義,故 key 可以是any 類型
a[key]  // 報錯,因為 key 可以是任何值,故會報錯。

let key: keyof Obj = "item1"  // 把 key 設(shè)置為 Obj 的key 的聯(lián)合類型,即: "item1" | "item2"
a[key]  // 正確,不會報錯
// 注意: keyof Obj 中的 Obj 是一個 接口,若 Obj 變量對象 則需要使用 keyof typeof Obj

注意: keyof Obj 中的 Obj 是一個 接口,若 Obj 變量對象 則需要使用 keyof typeof Obj

  1. 給對象添加 [key: string]: string |number ,意味著對象可添加任何 key 值
interface Obj {
  item1 : string,
  item2: number,
  [key: string]: string |number  // 意味著 使用該接口的 對象的key 是可以為任意值
}
let a: Obj = {  
  item1:"123",
  item2:1234
}
let key= "item1" 
a[key]  // 正確,不會報錯

let key= "item4"  
a[key]  // 正確,不會報錯, 注意: a 對象暫時沒有 key 為 item4 這個屬性
// 注意: 盡量不要使用這種方式定義對象

總結(jié): 盡量使用 第一種方式來解決 對象 [變量] 報錯的問題,第二種方法存在安全隱患
附: 在函數(shù)中的使用

const a = {
  item1: 'xxx',
  item2: 'xxx'
}
function getValue(arg: keyof typeof a) {
  return a[arg]
}
getValue('item1')

// 若聲明了接口
interface A{
  item1 : string,
  item2 : string
}
// 則 函數(shù)的參數(shù)類型可以這樣寫
function getValue(arg: keyof A) {
  return a[arg]
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容