文章內(nèi)容:
- 普通二維數(shù)組的定義
- key 可為任意類型的二維數(shù)組
- 解決對象使用 [變量] 的調(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],見下)是不允許使用 [ 變量 ] 的方式進行取值的,只能使用 . 操作符,但若我們必須使用 [變量] 進行對對象取值。有以下方法:
- 使用 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
- 給對象添加 [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]
}