Typy dostępu indeksowanego (lub typy dostęp po indeksie) pozwalają na odniesienie się do typu konkretnej właściwości obiektu lub dowolnego klucza za pomocą składni T[K]. To potężne narzędzie do tworzenia elastycznych i typowo bezpiecznych abstrakcji.
type Person = { name: string; age: number; }; type NameType = Person['name']; // string type AgeOrName = Person['age' | 'name']; // number | string
Używa się ich do pisania uniwersalnych typów i funkcji:
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] { return obj[key]; // poprawna typizacja zwrotu } const user = { email: 'a@a.ru', id: 1 }; let id = getProperty(user, 'id'); // id: number
Person['salary'] — błąd na etapie kompilacji.Pytanie: Jaki typ otrzymasz w wyrażeniu type Foo = {a: number, b: string}["a" | "b" | "c"]?
Odpowiedź: Ten przykład wywoła błąd kompilacji, ponieważ 'c' nie jest kluczem w typie, do którego następuje dostęp. TypeScript zgłosi błąd:
Typ '"c"' nie spełnia ograniczenia '"a" | "b"'.
Historia
W projekcie dynamicznie generowano formularze na podstawie typów. Po dodaniu nowego pola do podstawowego typu nie zaktualizowano miejsc z indeksacją po kluczach, w rezultacie niektóre właściwości nie trafiały do formularza, chociaż na poziomie typów oczekiwano pełnego mapowania. Błąd ujawnił się tylko w runtime, a nie na etapie rozwoju.
Historia
W bibliotece do walidacji danych używano dostępu indeksowanego przez typy, ale podczas migracji kodu przeniesiono jeden z kluczy z obiektu do rodzica. Stary indeksowany typ powodował błąd kompilacji, jednak błąd występował tylko po przebudowie z powodu cache w CI, a przed tym żył na staging przez kilka tygodni.
Historia
Błędnie sądzono, że za pomocą typów dostępu indeksowanego można odnosić się do dowolnego klucza, nawet jeśli nie jest on wyraźnie wymieniony, co doprowadziło do błędnej generacji testów automatycznych dla dynamicznych właściwości. W rezultacie testy nie pokrywały części możliwych scenariuszy, ponieważ kompilator odrzucał te przypadki jako niewłaściwe.