Proč nemohu v TypeScriptu tímto způsobem udělat pole pouze pro čtení?
Dokumentace ukazuje (#ReadOnlyArray), jak to udělat pomocí rozhraní, ale když prozkoumávám jazyk, zajímalo mě, proč toto také nefunguje?
type TraverseTuple<T extends Array<unknown>> = {
readonly [P in keyof T]: T[P];
}
const test: TraverseTuple<[string, number, string, number]> = ['s', 1, 'o', 2];
test[1] = 0; // not readonly !
Odpověď č. 1
Existuje vestavěný typ pole pouze pro čtení, který činí pole pouze k přečtení (pokud nejsou zpětně převedena na běžné pole).
const test: ReadonlyArray<string|number> = ['s', 1, 'o', 2];
test[1] = 0;
Ale pro n-tice potřebujete vytvořit explicitní typ, například takto:
const test: Readonly<{ 0: string, 1: number, 2: string, 3: number }> = ['s', 1, 'o', 2];
test[1] = 1;
Odpověď č. 2
Takové chování není speciálně podporováno. Schopnost mapovat n-tice byla do TypeScriptu 3.1 právě nedávno zavedena tímto PR. Z PR:
Anotace
readonly,-readonlynebo+readonlyv homomorfně mapovaném typu momentálně nemá žádný vliv na prvky pole nebo n-tice (mohli bychom zvážit mapování zArraynaReadonlyArraya naopak, i když to technicky není zachování struktury, protože to přidává nebo odstraňuje metody).
