Wzorce
Jedna strona na pytanie. Każdy przepis się kompiluje, każdy wynik to typ wypisany przez kompilator, a każda strona mówi, gdzie przepis zawodzi.
Każdy przepis i każdy wynik są kompilowane podczas budowania
- Jak powstrzymać przekazanie `UserId` tam, gdzie oczekiwano `OrderId`, skoro oba są zwykłymi tekstami?TypeScript jest strukturalny, więc dwa aliasy `string` to ten sam typ. Fantomowa właściwość czyni je różnymi, nie zmieniając wartości.Ostempluj prymityw
- Jak dostać błąd kompilacji, gdy ktoś doda przypadek do unii i zapomni go obsłużyć?Zawęź każdy przypadek i przypisz resztę do `never`. Gdy unia urośnie, reszta przestaje być niczym i przypisanie zawodzi.Uczyń switch wyczerpującym
- Jak powstrzymać `Omit<User, "nmae">` przed cichym sukcesem, który nic nie usuwa?Wbudowany ogranicza parametr klucza do `keyof any`, czyli do każdego klucza, jaki mógłby istnieć. Ogranicz go zamiast tego do `keyof T`.Spraw, by Omit łapał literówki
- Jak zamienić `{ a: string } & { b: number }` w `{ a: string; b: number }`, by podpowiedzi były czytelne, a testy równości przechodziły?Homomorficzne mapowanie przechodzi każdy klucz raz i odbudowuje jeden obiekt. Modyfikatory przeżywają; przecięcie nie.Spłaszcz przecięcie
- Dlaczego `Object.keys(config)` daje mi `string[]` zamiast kluczy, które widzę na miejscu?Bo wartość może mieć więcej kluczy, niż deklaruje jej typ, a `Object.keys` zwraca wszystkie. Zawężenie wyniku to świadoma, lokalna decyzja — a nie naprawa usterki.Uzyskaj typowane klucze obiektu
- Jak przyjąć obiekt opcji, w którym każde pole jest opcjonalne, ale pusty obiekt jest niedozwolony?Zbuduj po jednym wariancie na klucz, w którym ten klucz jest wymagany, a reszta opcjonalna, i połącz je unią. Każdy pojedynczy podany klucz spełnia co najmniej jeden wariant.Wymagaj co najmniej jednej właściwości
- Jak odczytać `user.address.city` przez ścieżkę wielokrotnego użytku bez utraty typu wyniku?Wygeneruj rekurencyjnie poprawne krotki kluczy, a potem zużywaj po jednym kluczu, by obliczyć wartość na końcu.Pobierz wartość po typowanej głębokiej ścieżce
- Jak utrzymać każdą nazwę zdarzenia w parze z właściwym ładunkiem i nasłuchiwaczem?Użyj mapy zdarzeń i jednego parametru klucza, aby nazwa zdarzenia wybierała typ ładunku w obu metodach.Nadaj typy emiterowi zdarzeń
- Jak sprawić, by dane sukcesu były dostępne tylko w gałęzi sukcesu, a błędy tylko w gałęzi porażki?Nadaj każdemu wariantowi jedno wspólne pole literalne. Jego sprawdzenie zawęża cały obiekt, nie tylko pole.Modeluj stany, które się zawężają
- Jak pozwolić wywołującym wybrać wejście i transformację bez zapisywania argumentów typu?Umieść parametry typu tam, gdzie ujawniają je wartości: jeden w elemencie tablicy, drugi w wyniku callbacku.Wywnioskuj wynik generyczny z callbacku
- Jak przyjąć `href` albo `onClick`, ale odrzucić obiekty podające oba?Połącz dwa kształty unią i dodaj unikalne klucze drugiej strony jako opcjonalne właściwości `never`.Uczyń dwa kształty propsów wzajemnie wykluczającymi
- Jak przyjąć jeden klucz wyszukiwania, odrzucając pustą kwerendę i kwerendę z kilkoma kluczami?Zbuduj wariant dla każdego klucza: wymagaj go i zabroń wszystkich pozostałych przez opcjonalne `never`.Wymagaj dokładnie jednej właściwości
- Jak uzyskać tylko klucze właściwości będących tekstami, funkcjami albo innym wybranym typem?Mapuj każdy klucz na niego samego albo `never`, a potem zindeksuj obiekt, by zebrać ocalałe.Wybierz klucze według typu wartości
- Jak zapobiec mutacji poniżej pierwszego poziomu właściwości, zamiast zamrażać tylko zewnętrzny typ obiektu?Zachowaj funkcje, przejdź rekurencyjnie przez tablice i zmapuj każdą właściwość obiektu z modyfikatorem readonly.Uczyń obiekt głęboko tylko do odczytu
- Jak utrzymać literalną unię oraz tablicę lub obiekt używany w czasie działania bez rozjazdu?Zachowaj jedną wartość jako źródło prawdy, utrzymaj literały przez `as const`, a potem zapytaj o jej typ.Wyprowadź unię z danych czasu działania
- Jak zachować zależność między każdym kluczem i jego wartością podczas iteracji po `Object.entries`?Zbuduj unię krotek klucz/wartość przez typ mapowany i zamknij nieuniknioną asercję w jednym pomocniku.Uzyskaj typowane pary z obiektu
- Jak sprawić, by pomocnik wywnioskował literalną krotkę bez wymagania od wywołujących `as const`?Oznacz parametr typu jako `const`; inferencja wybierze wtedy readonly literalne kształty zamiast poszerzonych tablic i prymitywów.Zachowaj literały generykiem const
- Jak przyjąć callback zwracający `T` albo `Promise<T>` i zawsze wystawić jeden przewidywalny wynik?Przyjmij wartość lub obietnicę, oczekaj jej i opisz spłaszczony wynik przez `Awaited`.Ujednolić callback synchroniczny lub asynchroniczny
- Jak wybrać jedną właściwość z każdego obiektu i zachować jej typ w zwracanej tablicy?Zwiąż klucz z `keyof T` i użyj dostępu indeksowanego dla elementu wyniku.Wyciągnij typowaną właściwość z obiektów
- Jak indeksować dyskryminowaną unię przez `kind`, zamiast wielokrotnie wyciągać składniki?Mapuj po unii i przemapuj każdy składnik na literalną wartość jego dyskryminatora.Zamień unię w mapę odnośników

