Pytania rekrutacyjne TypeScript z odpowiedziami
Typy, generyki, zawężanie, typy narzędziowe i warunkowe, konfiguracja i typowanie Reacta.
225 pytań na rozmowę rekrutacyjną z tematu TypeScript z odpowiedziami i wyjaśnieniami - poziomy Junior, Middle i Senior. Przykładowe pytania, testy online i zadania z kodu.
- Generics
- Narrowing
- Utility types
- tsconfig
Pytania według poziomu
Junior
Podstawowe pojęcia i składnia · 50 pytań
Middle
Praktyka, niuanse i optymalizacja · 50 pytań
Senior
Architektura, mechanizmy wewnętrzne, przypadki brzegowe · 50 pytań
Przykładowe pytania
Kilka pytań z każdego poziomu z poprawną odpowiedzią i wyjaśnieniem.
TypeScript · Junior
- Czym jest TypeScript?
Poprawna odpowiedź: Nadzbiorem JavaScriptu ze statycznym typowaniem, kompilowanym do JS
Każdy poprawny JS jest prawie zawsze poprawnym TS. Typy są sprawdzane podczas kompilacji, a potem usuwane: w runtime działa zwykły JavaScript i nie ma tam sprawdzania typów. Dlatego dane zewnętrzne (API, formularze) nadal waliduje się w runtime - np. przez Zod.
- Czy TypeScript sprawdza typy podczas działania programu?
Poprawna odpowiedź: Nie: typy są usuwane podczas kompilacji; w runtime działa zwykły JS
TypeScript to narzędzie czasu programowania. Jeśli API zwróci
nullzamiast obiektu, typy cię nie uratują. Do sprawdzeń w runtime używa siętypeof/instanceofi bibliotek schematów (Zod, Valibot), z których można też wyprowadzić typy TS. - Czym
unknownróżni się odany?Poprawna odpowiedź: Z
unknownnic nie zrobisz bez zawężenia, aanywyłącza sprawdzanieanywyłącza typowanie i „zaraża” wszystko, czego dotknie.unknownto bezpieczny odpowiednik: wartość może być czymkolwiek, ale użyć jej można dopiero po sprawdzeniu (typeof x === 'string'). Dla danych zJSON.parseicatch (e)właściwym wyborem jestunknown. - Co oznacza typ
never?Poprawna odpowiedź: Typ wartości, która nie może istnieć: funkcja nigdy nie zwraca sterowania
neverto typ pusty. Zwracają go funkcje, które zawsze rzucają błąd lub działają w nieskończoność. Pojawia się też, gdy unia jest w pełni zawężona - na tym opierają się wyczerpujące sprawdzenia wswitch.voidoznacza, że funkcja się kończy, ale jej wynik nie jest używany.
TypeScript · Middle
- Co oznacza
<T extends { id: string }>w generyku?Poprawna odpowiedź: Ograniczenie:
Tmusi mieć co najmniej właściwośćid: stringOgraniczenie pozwala bezpiecznie odwoływać się do
item.idwewnątrz funkcji, zachowując pełny typTw wyniku. Można przekazać dowolny obiekt z odpowiednimidi innymi polami. Klasy i dziedziczenie nie mają z tym nic wspólnego. - Jak otypować
getProp(obj, key), by wynik zależał od klucza?Poprawna odpowiedź:
function getProp<T, K extends keyof T>(obj: T, key: K): T[K]K extends keyof Tdopuszcza tylko istniejące klucze, a dostęp indeksowanyT[K]daje dokładny typ wartości:getProp(user, 'age')→number. Wersja zanytraci typowanie, astringprzepuszcza literówki. - Co robi typ warunkowy
T extends string ? 'text' : 'other'?Poprawna odpowiedź: Wybiera jeden z typów w zależności od tego, czy
Tjest przypisywalny dostringTypy warunkowe to „operator trójargumentowy” na poziomie typów. Razem z
inferpozwalają wyciągać części typów. Zastosowane do unii rozkładają się na każdy człon (distributive conditional types). - Co robi
inferwtype ElementType<T> = T extends (infer U)[] ? U : never?Poprawna odpowiedź: Deklaruje zmienną typu
U, którą TS wywnioskuje z dopasowania do wzorcainferstosuje się tylko w częściextendstypu warunkowego: TS dopasowujeTdo wzorca i „przechwytuje” potrzebną część.ElementType<string[]>→string. Tak działająReturnType,ParametersiAwaited.
TypeScript · Senior
- Czy przy
strictFunctionTypesmożna przypisać(x: Dog) => voiddo zmiennej typu(x: Animal) => void?Poprawna odpowiedź: Nie: parametry funkcji są sprawdzane kontrawariantnie
Zmienna obiecuje przyjąć dowolne
Animal, a funkcja umie obsłużyć tylkoDog- wywołanie zCatby ją zepsuło. Dlatego podtypowanie po parametrze działa w odwrotną stronę:(x: Animal) => voidmożna przypisać tam, gdzie oczekiwane jest(x: Dog) => void, ale nie odwrotnie. - Dlaczego
strictFunctionTypesnie działa dla metody zadeklarowanej jakohandle(x: Dog): void?Poprawna odpowiedź: Parametry w składni metody są sprawdzane biwariantnie pod kątem zgodności
Biwariantność metod zachowano, by wiele wbudowanych typów (np.
Array<T>) pozostało zgodnych. Jeśli zamiast tego zadeklarujesz właściwość-funkcjęhandle: (x: Dog) => void, sprawdzenie będzie ścisłe. Dlatego dla callbacków w interfejsach często wybiera się składnię właściwości. - Czym jest
ToArray<string | number>, jeślitype ToArray<T> = T extends any ? T[] : never?Poprawna odpowiedź:
string[] | number[]Typ warunkowy nad „gołym” parametrem typu rozkłada się na unię: warunek jest stosowany do każdego członu osobno. To distributive conditional type - na nim zbudowane są
ExcludeiExtract. - Jak wyłączyć rozkładanie typu warunkowego na unię?
Poprawna odpowiedź: Opakować obie strony w krotkę:
[T] extends [U] ? X : YRozkład następuje tylko wtedy, gdy sprawdzany typ jest „gołym” parametrem. Krotka
[T]czyni go złożonym, więc unia jest sprawdzana w całości:[string | number] extends [string]→ false. Nie ma do tego ustawienia kompilatora.
Testy łączone z tym tematem
Pytania z kilku tematów naraz - jak na rozmowie rekrutacyjnej na konkretne stanowisko.
Zadania z kodu
Napisz rozwiązanie prosto w przeglądarce, a testy od razu je sprawdzą. Klasyka rozmów rekrutacyjnych: debounce, throttle, deepClone, Promise.all, EventEmitter, cache LRU i inne.
Otwórz zadania →