Vyhledávání na webu

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, -readonly nebo +readonly v homomorfně mapovaném typu momentálně nemá žádný vliv na prvky pole nebo n-tice (mohli bychom zvážit mapování z Array na ReadonlyArray a naopak, i když to technicky není zachování struktury, protože to přidává nebo odstraňuje metody).

Související články