javascript - Hva er forskjellen mellom indekserbare typer og arrayer i Typescript


Jeg lærer Typescript, og jeg har kommet til punktet med indekserbare typer hvor jeg ble presentert for eksemplet som:

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

let myStr: string = myArray[0];

utdata er: Bob

Som vi kan erklære type array som:

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

utdata er: Bob

så mitt spørsmål er hva forskjellen er mellom disse to tilnærmingene? og hvor kan vi bruke slike indekserbare typer i stedet for matriser?

Svar #1

Ethvert objekt i JavaScript kan indekseres, forskjellen er hva annet du får.

Grensesnittet StringArray definerer et hvilket som helst objekt som kan indekseres med et number og har alle verdier av typen string. Dette kan selvfølgelig være et array, men det kan være et hvilket som helst annet objekt som tilfredsstiller denne begrensningen. Eksempel:

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 tilfredsstiller StringArray men er ikke en ekte Array, siden den ikke har alle metodene til et array (og dermed mislykkes tildelingen til arr), og selv om den hadde det, ble den ikke opprettet ved hjelp av array-litteral syntaks ([]) eller new Array, så det er ikke en instans av et Array (derfor returnerer o instanceof Array false).

string[] (og tilsvarende Array<string>) modellerer derimot et ekte JavaScript-array.

Relaterte artikler