typescript - Forskjellen mellom Readonly<[]> og ReadOnlyArray<>
Kode 1:
let readonlyArray: ReadonlyArray<string | number> = ["test", 1, 1];
Kode 2:
let readonlyArray: Readonly<[string, number]> = ["test", 1, 1];
Begge kodelinjene ser ut til å gjøre lignende ting. Jeg vet ikke hva forskjellen er mellom å erklære et array som ReadOnly og ReadOnlyArray.
Også, hvilken er best for ytelse og hvorfor?
Svar #1
Fra et ytelsesperspektiv bør det ikke være noen forskjell mellom de to, siden typer fjernes ved kjøringstid og den samme JavaScript-en vil kjøre uansett
Det er en grunnleggende forskjell mellom de to typene på kompileringstidspunktet:
Readonly<T> - Er en type som har samme form som T men alle egenskapene er skrivebeskyttet. I ditt tilfelle er T tuple-typen [string, number], så den vil ha alle egenskapene til en array, samt indeksene 0 og 1. Så vi kan kalle push-metoden, men vi kan ikke tilordne concat-metoden på nytt.
let readonlyArray: Readonly<[string, number]> = ["test", 1, 1];
readonlyArray.concat = ()=> {} // Not valid, concat is readonly
readonlyArray.push(1); // This is valid
readonlyArray[1] = ""; // Invalid we cannot change a property by indexing
readonlyArray[3] = ""; // Valid as it was not in the original tuple type
Rediger: Siden 3.4 har TypeScript endret oppførselen til kartlagte typer på arrays og tuples, så Readonly<[string, number]> er nå ekvivalent med en readonly tuple readonly [string, number], så feilene er litt annerledes:
let readonlyArray: Readonly<[string, number]> = ["test", 1];
readonlyArray.concat = ()=> {} // Not valid, concat is readonly
readonlyArray.push(1); // This is not valid, no push method anymore
readonlyArray[1] = ""; // Invalid we cannot change a property by indexing
readonlyArray[3] = ""; // Invalid now tuple length preserved
</Rediger>
ReadonlyArray<T> er et ekte skrivebeskyttet array som ikke har noen metoder som kan endre arrayen. I ditt tilfelle kan ethvert element i arrayen være enten en string eller en number:
let readonlyArray2: ReadonlyArray<string | number> = ["test", 1, 1];
readonlyArray2.concat = ()=> []; // Valid we can set the concat property on the object
readonlyArray2.push(1) // No push method, invalid
readonlyArray2[1] = ""; // Invalid it is read only
readonlyArray2[3] = ""; // Invalid it is read only
