我正在学习打字稿,并且我已经提到了“可索引类型”,在此我以示例形式呈现:
Converting circular structure to JSON at JSON.stringify (<anonymous>)
输出是:Bob
我们可以将类型数组声明为:
interface StringArray {
[index: number]: string;
}
let myArray: StringArray;
myArray = ["Bob", "Fred"];
let myStr: string = myArray[0];
输出是:Bob
所以我的问题是这两种方法有什么区别?在哪里可以使用这种可索引类型而不是数组?
答案 0 :(得分:5)
JavaScript中的任何对象都是可索引的,不同之处在于您还得到了什么。
StringArray
接口定义了number
可以索引的任何对象,并具有字符串类型的所有值。当然,它可以是一个数组,但也可以是任何其他满足此约束的对象。例如:
interface StringArray {
[index: number]: string;
}
let o : StringArray = {
0: "A", //ok
// "V" : "B" // error
// 1: 0 error
}
let arr : Array<string> = o; // Error
console.log(o instanceof Array) // false
o
满足StringArray
但不是真正的Array
,因为它没有数组的所有方法(因此分配给arr
失败),并且即使它不是使用数组文字语法([]
)或new Array
创建的,因此它也不是Array
的实例(因此o instanceof Array
返回false)。
string[]
(和等效的Array<string>
)则是对真实的JavaScript数组进行建模。