Şemadan Türe Eşleme
Tablo tanımlarının nasıl TypeScript türlerine dönüştüğünü öğrenin.
Şemadan Türe Eşleme, CoddyKit'te ücretsiz bir TypeScript Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, TypeScript Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. TypeScript Academy kursu toplamda 4 dersten oluşur.
Tablo Tanımından Satır Türüne
Tür güvenli bir ORM, bir veritabanı tablosunu bir kez açıklamanıza ve satırının TypeScript türünü otomatik olarak türetmenize olanak tanır. Satır yapısını hiçbir zaman elle yazmazsınız; bu yapı sütun tanımlarından hesaplanır.
Bu derste, devam eden örnek olarak Drizzle tarzı bir pgTable kullanacağız.
Tablo Tanımlama
Tablo, sütun adlarını sütun oluşturucularına eşleyen bir nesnedir. Her oluşturucu, bir SQL türünü ve notNull ya da primaryKey gibi değiştiricileri içerir.
import { pgTable, serial, text, integer, boolean } from "drizzle-orm/pg-core";
export const users = pgTable("users", {
id: serial("id").primaryKey(),
name: text("name").notNull(),
age: integer("age"),
isAdmin: boolean("is_admin").notNull(),
});Sütun Türü Çıkarımı
Her sütun oluşturucusu, ürettiği değeri açıklayan hayali bir tür taşır. serial ve integer, number türüne; text, string türüne; boolean ise boolean türüne karşılık gelir.
Oluşturucu, sütunun boş değer alıp alamadığını da takip eder.
import { InferSelectModel } from "drizzle-orm";
// Row type inferred from the table above
type User = InferSelectModel<typeof users>;
// {
// id: number;
// name: string;
// age: number | null; // not notNull -> nullable
// isAdmin: boolean;
// }notNull Null Olabilirliğini Denetler
Satır türünü belirleyen en önemli etken notNull() işlevdir. Bunu içermeyen bir sütun, SQL varsayılan olarak NULL değerine izin verdiği için çıkarılan türde T | null olur.
const posts = pgTable("posts", {
id: serial("id").primaryKey(),
title: text("title").notNull(), // string
subtitle: text("subtitle"), // string | null
});
type Post = InferSelectModel<typeof posts>;
// { id: number; title: string; subtitle: string | null }select ve insert Modelleri
Okuma (select) işlemi için kullanılan satır türü, yazma (insert) işlemi için kullanılan türden farklıdır. insert işleminde varsayılan değerlere sahip veya otomatik artan sütunlar isteğe bağlı hâle gelir.
import { InferInsertModel } from "drizzle-orm";
type NewUser = InferInsertModel<typeof users>;
// {
// id?: number; // serial has a default -> optional
// name: string;
// age?: number | null;
// isAdmin: boolean;
// }Çıkarım Nasıl Çalışır
Arka planda her sütun oluşturucu, PgColumn<{ data: number; notNull: true }> gibi genel bir sınıftır. Eşlenmiş bir tür, tablonun her anahtarını dolaşır ve bu bayrakları okur.
// Simplified mental model of the inference
type InferRow<T> = {
[K in keyof T]: T[K] extends { _: { data: infer D; notNull: infer N } }
? N extends true ? D : D | null
: never;
};Enum ve Özel Türler
Dize birleşimi sütunları yalnızca string türüne değil, sabit değer birleşimlerine eşlenir. Bu, geçersiz bir durum değerinin derleme hatasına dönüşmesi anlamına gelir.
import { pgEnum } from "drizzle-orm/pg-core";
export const roleEnum = pgEnum("role", ["user", "admin", "owner"]);
export const members = pgTable("members", {
id: serial("id").primaryKey(),
role: roleEnum("role").notNull(), // "user" | "admin" | "owner"
});Varsayılan Değerler
.default(), bir sütunu insert işleminde isteğe bağlı hâle getirirken select işleminde mevcut kalmasını sağlar. Tür sistemi, yalnızca uygun yerlerde isteğe bağlılığı değiştirebilmek için "varsayılanı var" bilgisini kodlar.
const events = pgTable("events", {
id: serial("id").primaryKey(),
createdAt: text("created_at").notNull().default("now()"),
});
// Select: createdAt is string
// Insert: createdAt is optional (default fills it)Bu Neden Önemli
Satır türü türetildiği için bir şema değişikliği, her sorgu sonucunun türünü otomatik olarak günceller. Bir sütunu yeniden adlandırdığınızda derleyici, güncel olmayan her başvuruyu bildirir. Farklılaşabilecek ikinci bir doğruluk kaynağı yoktur.
Baştan Sona Küçük Bir Örnek
Hepsini bir araya getirelim: bir kez tanımlayın, türü çıkarın ve bunu bir depo işlevinin sözleşmesi olarak kullanın.
type User = InferSelectModel<typeof users>;
async function findUser(id: number): Promise<User | undefined> {
// db.query returns rows already typed as User
const rows = await db.select().from(users).where(eq(users.id, id));
return rows[0];
}Sorun: notNull Unutulursa
Aslında gerekli olan bir sütunda notNull() kullanmayı unutursanız çıkarılan tür T | null olur ve kodunuzun her yerinde gereksiz null denetimleri yapmanız gerekir. Şemayı gerçeği yansıtacak şekilde tutun.
Hızlı Denetim
Şemadan türe doğru eşlemeyi anlayıp anlamadığınızı sınayın.
Özet
Bir tablo tanımının tek doğruluk kaynağı olduğunu öğrendiniz: sütun oluşturucular hayalet türleri taşır, eşlenmiş türler satır türünü oluşturmak için tabloyu dolaşır, notNull() null olabilirliğini denetler ve select ile insert modelleri isteğe bağlılık açısından farklılık gösterir. Şemayı değiştirin; her sonuç türü bunu otomatik olarak izler.
Sıkça Sorulan Sorular
“Şemadan Türe Eşleme” dersi ücretsiz mi?
Evet — “Şemadan Türe Eşleme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve TypeScript Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. TypeScript Academy kursu toplamda 4 dersten oluşur.
“Şemadan Türe Eşleme” dersinde ne öğreneceğim?
Tablo tanımlarının nasıl TypeScript türlerine dönüştüğünü öğrenin. TypeScript Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
TypeScript Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te TypeScript Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.
“Şemadan Türe Eşleme” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu TypeScript Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her TypeScript Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Şemadan Türe Eşleme
- Tür Güvenli Sorgu Oluşturma
- Sorgu Sonucu Biçimlerini Çıkarma
- Türlerle İlişkiler ve Birleştirmeler