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

标签 javascript angular typescript

我正在学习 Typescript,我已经到了可索引类型的地步,我将示例展示为:

interface StringArray {
    [index: number]: string;
}
let myArray: StringArray;
myArray = ["Bob", "Fred"];

let myStr: string = myArray[0];

输出是:Bob

因为我们可以将类型数组声明为:

let myArray:string[];
myArray = ["Bob","Fred"];
console.log(myArray[0]);

输出是:Bob

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

最佳答案

JavaScript 中的任何对象都是可索引的,区别在于您得到的是什么。

StringArray接口(interface)定义任何可以被 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 数组。

关于javascript - Typescript 中的可索引类型和数组有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51263290/

相关文章:

javascript - 当对象可以具有不同类型时如何按键对对象数组进行分组

javascript - 在 Angular 中监听自定义 DOM 事件

spring - 如何使用 Angular 前端构建我的 Spring 项目?

javascript - Angularjs:如何在重新加载后保留复选框值

javascript - 如何计算一个值在没有突变的情况下在数组中出现的次数

Javascript长整数

angular - 错误 : Cannot match any routes. URL 段: 'homePage'

angular - 同一数据源的 2 个 mat-paginator

typescript - Vue 3 如何传递一个可选的 bool Prop ?

javascript - 在 React Native 中使用 axios 从带有参数的 GET 方法的 HTTP 响应