定義:描述那些能夠“通過索引得到”的類型碳胳,比如a[10]或者a['10']
可索引類型具有一個?索引簽名,它描述了對象?索引的類型?沫勿,還有相應(yīng)的 索引返回值類型
例子:
interface StringArray {
? [index: number]: string;
}
這個索引簽名表示了當(dāng)用?number去索引StringArray時會得到string類型的返回值挨约。
TypeScript支持兩種索引簽名:字符串和數(shù)字。 可以同時使用兩種類型的索引产雹,但是數(shù)字索引的返回值必須是字符串索引返回值類型的子類型诫惭。 這是因為當(dāng)使用?number來索引時,JavaScript會將它轉(zhuǎn)換成string然后再去索引對象蔓挖。 也就是說用?100(一個number)去索引等同于使用"100"(一個string)去索引夕土,因此兩者需要保持一致。
例子:
class Animal {
? ? name: string;
}
class Dog extends Animal {
? ? breed: string;
}
Animal!interface NotOkay {
? ? [x: number]: Animal;
? ? [x: string]: Dog;
}
?錯誤:相當(dāng)于number->string->Animal 瘟判,string->Dog,但是Animal不是Dog的子類型
加入了索引簽名怨绣,就會對索引類型和返回值類型進行檢查
interface NumberDictionary {
? [index: string]: number;
? length: number; ? ?// 可以,length是number類型??
name: string? ? ? // 錯誤拷获,`name`的類型與索引類型返回值的類型不匹配
}
你可以將索引簽名設(shè)置為只讀篮撑,這樣就防止了給索引賦值:
interface ReadonlyStringArray {
? ? readonly [index: number]: string;
}
let myArray: ReadonlyStringArray = ["Alice", "Bob"];
myArray[2] = "Mallory"; // error!
額外的屬性檢查檢查時,可以用索引類型避免編譯錯誤
interface SquareConfig {
? ? color: string
}
function test(config: SquareConfig):void{
}
test({ color: "red", width: 100 });//報錯
interface SquareConfig {
? ? color: string匆瓜;
[propName: string]: any;
}
function test(config: SquareConfig):void{
}
test({?color: "red", width: 100 });//編譯通過
參考:https://www.tslang.cn/docs/handbook/interfaces.html