0Pricing
TypeScript Academy · Pelajaran

Pemetaan Skema ke Jenis

Pahami cara definisi tabel menjadi jenis TypeScript.

Pemetaan Skema ke Jenis adalah pelajaran TypeScript Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar TypeScript Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus TypeScript Academy mencakup 4 pelajaran total.

Dari Definisi Tabel ke Tipe Baris

ORM yang aman tipe memungkinkan Anda mendeskripsikan tabel basis data sekali dan menurunkan tipe baris TypeScript secara otomatis. Anda tidak perlu menulis bentuk baris secara manual; bentuk tersebut dihitung dari definisi kolom.

Dalam pelajaran ini, kita menggunakan pgTable bergaya Drizzle sebagai contoh utama.

Mendefinisikan Tabel

Tabel adalah objek yang memetakan nama kolom ke pembuat kolom. Setiap pembuat menyandikan tipe SQL beserta pengubah seperti notNull atau primaryKey.

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(),
});

Inferensi Tipe Kolom

Setiap pembuat kolom membawa informasi tipe tersembunyi yang menjelaskan nilai yang dihasilkannya. serial dan bilangan bulat dipetakan ke number, text ke string, dan boolean ke boolean.

Pembuat tersebut juga melacak apakah kolom dapat bernilai null.

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 Mengendalikan Kemungkinan NULL

Faktor terpenting yang menentukan tipe baris adalah notNull(). Kolom yang tidak menggunakannya menjadi T | null dalam tipe hasil inferensi, karena SQL mengizinkan NULL secara bawaan.

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 }

Model Select dan Insert

Tipe baris untuk membaca (select) berbeda dari tipe untuk menulis (insert). Saat insert, kolom dengan nilai bawaan atau kenaikan otomatis menjadi opsional.

import { InferInsertModel } from "drizzle-orm";

type NewUser = InferInsertModel<typeof users>;
// {
//   id?: number;        // serial has a default -> optional
//   name: string;
//   age?: number | null;
//   isAdmin: boolean;
// }

Cara Kerja Inferensi

Di balik layar, setiap pembangun kolom adalah kelas generik seperti PgColumn<{ data: number; notNull: true }>. Tipe terpetakan menelusuri setiap kunci tabel dan membaca penanda tersebut.

// 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 dan Tipe Khusus

Kolom gabungan nilai teks dipetakan ke gabungan literal, bukan sekadar string. Ini berarti nilai status yang tidak valid menjadi galat kompilasi.

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"
});

Nilai Bawaan

.default() membuat kolom opsional saat insert, tetapi tetap ada saat select. Sistem tipe menyandikan informasi "memiliki nilai bawaan" agar sifat opsional hanya diubah di tempat yang sesuai.

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)

Mengapa Ini Penting

Karena tipe baris diturunkan, perubahan skema otomatis memperbarui tipe setiap hasil kueri. Ganti nama kolom, dan kompilator menandai setiap rujukan yang sudah usang. Tidak ada sumber kebenaran kedua yang dapat menyimpang.

Contoh Menyeluruh yang Singkat

Menggabungkan semuanya: definisikan sekali, simpulkan tipenya, lalu gunakan sebagai kontrak untuk fungsi repositori.

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];
}

Kesalahan Umum: Melupakan notNull

Jika Anda lupa menggunakan notNull() pada kolom yang sebenarnya wajib diisi, tipe hasil inferensi menjadi T | null dan memaksa pemeriksaan NULL yang tidak perlu di seluruh kode Anda. Jagalah agar skema tetap mencerminkan kondisi sebenarnya.

Pemeriksaan Singkat

Uji pemahaman Anda tentang pemetaan skema ke tipe.

Rangkuman

Anda mempelajari bahwa definisi tabel adalah satu-satunya sumber kebenaran: pembangun kolom membawa tipe semu, tipe terpetakan menelusuri tabel untuk membangun tipe baris, notNull() mengendalikan kemungkinan NULL, dan model select serta insert berbeda dalam hal sifat opsional. Ubah skema, dan setiap tipe hasil akan mengikuti secara otomatis.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Pemetaan Skema ke Jenis” gratis?

Ya — teks lengkap “Pemetaan Skema ke Jenis” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus TypeScript Academy, upgrade ke CoddyKit PRO. Kursus TypeScript Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Pemetaan Skema ke Jenis”?

Pahami cara definisi tabel menjadi jenis TypeScript. Kamu berlatih TypeScript Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai TypeScript Academy?

Tidak diperlukan pengalaman sebelumnya. TypeScript Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.

Berapa lama pelajaran “Pemetaan Skema ke Jenis” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran TypeScript Academy ini?

Ya. Setiap pelajaran TypeScript Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Pemetaan Skema ke Jenis
  2. Pembuatan Kueri yang Aman Secara Jenis
  3. Menyimpulkan Bentuk Hasil Kueri
  4. Relasi dan Join dengan Jenis
← Kembali ke TypeScript Academy