Typescript中可索引类型和数组有什么区别

时间:2018-07-10 10:48:15

标签: javascript angular typescript

我正在学习打字稿,并且我已经提到了“可索引类型”,在此我以示例形式呈现:

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

所以我的问题是这两种方法有什么区别?在哪里可以使用这种可索引类型而不是数组?

1 个答案:

答案 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数组进行建模。