Wnioskowanie kształtów wyników zapytań
Pozwól konstruktorowi zapytań wnioskować typ zwracanych wierszy
Wnioskowanie kształtów wyników zapytań to bezpłatna lekcja TypeScript Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej TypeScript Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs TypeScript Academy zawiera 4 lekcji w sumie.
Typ wyniku odzwierciedla wybór kolumn
Dobry konstruktor zapytań nie tylko sprawdza dane wejściowe, ale także wnioskuje dokładny kształt każdego wiersza wyniku na podstawie wybranych kolumn. Im mniej kolumn zostanie wybranych, tym węższy będzie typ wyniku.
Wybieranie całego wiersza
Wywołanie select() bez projekcji zwraca typ całego wiersza.
const rows = await db.select().from(users);
// rows: { id: number; name: string; age: number | null; isAdmin: boolean }[]Częściowy wybór zawęża typ
Wybierz tylko potrzebne kolumny, a typ wyniku będzie zawierał wyłącznie te klucze.
const rows = await db
.select({ id: users.id, name: users.name })
.from(users);
// rows: { id: number; name: string }[]
// Accessing rows[0].age is a compile error.Zmiana nazw kolumn w wyniku
Klucze obiektu select stają się kluczami wyniku, dlatego można dowolnie zmieniać nazwy, a typ odzwierciedli nowe nazwy.
const rows = await db
.select({ userId: users.id, fullName: users.name })
.from(users);
// rows: { userId: number; fullName: string }[]Kolumny obliczane i agregowane
Funkcje agregujące mają własny wywnioskowany typ. count() zwraca liczbę, a klucz aliasu nadaje jej nazwę w wyniku.
import { count } from "drizzle-orm";
const rows = await db
.select({ total: count() })
.from(users);
// rows: { total: number }[]Nullowalność jest zachowywana
Jeśli zostanie wybrana kolumna dopuszczająca null, jej nullowalność zostanie zachowana w wyniku. Wybranie kolumny age zachowuje typ number | null.
const rows = await db.select({ age: users.age }).from(users);
// rows: { age: number | null }[]Jak budowane jest wnioskowanie typów
Typ wyniku jest typem mapowanym nad obiektem select: każda wartość jest kolumną, której typ data oraz nullowalność są odczytywane i przypisywane do odpowiadającego jej klucza.
type InferSelect<S> = {
[K in keyof S]: S[K] extends Column<infer D, infer Null>
? Null extends true ? D | null : D
: never;
};Pomocniki dla pojedynczego wiersza
Niektóre konstruktory udostępniają dostęp za pomocą .get() lub [0]. Typ elementu nadal wynika z tego samego wyboru, ale zostaje wyodrębniony z tablicy.
const one = (await db.select({ id: users.id }).from(users))[0];
// one: { id: number } | undefinedZłączenia rozszerzają kształt wyniku
Po wykonaniu złączenia typ wyniku zyskuje klucze z dołączonej tabeli. Częściowe wybory kolumn z połączonych tabel nadal precyzyjnie zawężają typ. (Złączenia zostaną omówione w osobnej lekcji).
const rows = await db
.select({ name: users.name, title: posts.title })
.from(users)
.innerJoin(posts, eq(posts.authorId, users.id));
// rows: { name: string; title: string }[]Dlaczego zawężanie ma znaczenie
Zwracanie wyłącznie wybranych kluczy zapobiega przypadkowemu poleganiu na kolumnach, które nie zostały pobrane. Typ odzwierciedla rzeczywiste zapytanie SQL, dlatego błędy związane z pobraniem zbyt wielu lub zbyt małej liczby danych ujawniają się w edytorze.
Pułapka: rozwinięcie wiersza, a następnie wybór pól
Jeśli zostanie pobrany cały wiersz, a następnie ręcznie wybrane klucze w JS, traci się korzyść z zawężania na poziomie bazy danych i przesyła przez sieć dodatkowe kolumny. Lepiej zawężać wynik już w zapytaniu.
Szybkie sprawdzenie
Sprawdź, czy rozumiesz wywnioskowane kształty wyników.
Podsumowanie
Typ wyniku jest obliczany na podstawie wybranych kolumn za pomocą typu mapowanego: pełne wybory zwracają cały wiersz, częściowe wybory zawężają wynik do wybranych kluczy, zmiana nazw modyfikuje klucze wyniku, nullowalność jest zachowywana, a funkcje agregujące mają własne typy. Typ statyczny zawsze odzwierciedla rzeczywiste zapisane zapytanie SQL.
Często zadawane pytania
Czy lekcja „Wnioskowanie kształtów wyników zapytań” jest bezpłatna?
Tak — pełny tekst „Wnioskowanie kształtów wyników zapytań” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu TypeScript Academy, przejdź na CoddyKit PRO. Kurs TypeScript Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Wnioskowanie kształtów wyników zapytań”?
Pozwól konstruktorowi zapytań wnioskować typ zwracanych wierszy Ćwiczysz TypeScript Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć TypeScript Academy?
Nie wymagamy żadnego doświadczenia. TypeScript Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Wnioskowanie kształtów wyników zapytań”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji TypeScript Academy?
Tak. Każda lekcja TypeScript Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Mapowanie schematu na typ
- Bezpieczne typowo konstruowanie zapytań
- Wnioskowanie kształtów wyników zapytań
- Relacje i złączenia z typami