0Pricing
TypeScript Academy · Pelajaran

Merancang DSL Kueri Fluent

Bangun API kueri yang dapat dirangkai dan memvalidasi dirinya sendiri.

Merancang DSL Kueri Fluent adalah pelajaran TypeScript Academy gratis di CoddyKit. Ini adalah pelajaran 2 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.

Merancang DSL Kueri Berantai

Kita merancang DSL kueri yang dapat dirangkai, di mana setiap langkah menyempurnakan langkah berikutnya yang diizinkan melalui tipe kembalian. Hasilnya terbaca seperti SQL dan menolak urutan yang tidak valid saat kompilasi.

Tata Bahasa Target

Kita menginginkan: from lalu where opsional (dapat diulang), kemudian select sebagai langkah terminal. Anda tidak dapat memanggil select sebelum from, dan tidak dapat memanggil from dua kali.

Antarmuka Status

Modelkan setiap tahap sebagai antarmuka yang mengembalikan tahap berikutnya.

interface Builder {
  from(table: string): FromStage;
}
interface FromStage {
  where(cond: string): FromStage; // repeatable
  select(...cols: string[]): Result;
}
interface Result { sql: string; }

Menegakkan Urutan

Karena select hanya ada pada FromStage, memanggilnya pada Builder awal merupakan galat kompilasi. Urutan ditegakkan sepenuhnya berdasarkan metode yang disediakan oleh setiap tahap.

declare const db: Builder;
db.from("users").select("id"); // ok
db.select("id");               // Error: select missing on Builder

Melacak Kolom yang Dipilih

Tambahkan generik semu untuk mengingat kolom yang dipilih, sehingga tipe hasil menjadi tepat.

interface FromStage<T extends string = never> {
  where(c: string): FromStage<T>;
  select<C extends string>(...cols: C[]): Result<C>;
}
interface Result<C extends string> { columns: C[]; }

Menyempurnakan Setiap Pemanggilan

Setiap where juga dapat mengakumulasikan batasan dalam tipe. Di sini kita membuatnya sederhana, tetapi polanya dapat digeneralisasi untuk melacak parameter yang diikat.

const q = db.from("users").where("age > 18").where("active = true");
// still FromStage; select remains available

Mencegah from Berulang

Karena FromStage tidak menyediakan from, Anda tidak dapat memanggilnya dua kali. Tata bahasanya melarang hal tersebut secara struktural, tanpa memerlukan penjagaan saat waktu berjalan.

db.from("a").from("b"); // Error: from does not exist on FromStage

Langkah Terminal

select mengembalikan Result, yang tidak menyediakan where maupun from, sehingga mengakhiri rangkaian. Hanya operasi untuk membaca hasil yang tersisa.

const r = db.from("users").select("id", "name");
r.columns; // ("id" | "name")[]
// r.where(...) -> Error: where not on Result

Batasan Kolom Bertipe

Batasi kolom ke skema tabel yang diketahui dengan generik lain, sehingga kolom yang tidak dikenal ditolak dan DSL ini dapat dipadukan dengan gagasan ORM sebelumnya.

interface Table<Cols extends string> {
  select<C extends Cols>(...cols: C[]): Result<C>;
}
// db.from gives Table<"id" | "name" | "age">

Langkah Opsional dan Wajib

Jadikan sebuah langkah wajib dengan hanya menyediakan metode berikutnya setelah langkah tersebut. Misalnya, paksa setidaknya satu where dengan mengembalikan tahap yang menyediakan select hanya setelah where dipanggil. Tipe berantai yang sama juga dapat menyimpulkan tipe baris hasil dari pelaksanaan kueri, sehingga tata bahasa saat kompilasi terhubung dengan data saat waktu berjalan.

Mengapa Ini Penting

DSL berantai yang dirancang dengan cara ini mendokumentasikan dirinya sendiri dan tidak mungkin disalahgunakan: pelengkapan otomatis hanya menampilkan langkah berikutnya yang valid, dan urutan yang tidak sah tidak pernah berhasil dikompilasi. Inilah fondasi pustaka pembangun yang nyaman digunakan.

Uji Cepat

Pastikan pemahaman Anda tentang perancangan DSL berantai.

Ringkasan

Anda merancang DSL kueri berantai sebagai mesin status tingkat tipe: setiap antarmuka tahap mengembalikan tahap berikutnya dan hanya menyediakan metode yang valid. Generik semu melacak kolom yang dipilih, tahap terminal mengakhiri rangkaian, dan batasan kolom menolak nama yang tidak dikenal; semuanya ditegakkan oleh tipe kembalian.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Merancang DSL Kueri Fluent” gratis?

Ya — teks lengkap “Merancang DSL Kueri Fluent” 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 “Merancang DSL Kueri Fluent”?

Bangun API kueri yang dapat dirangkai dan memvalidasi dirinya sendiri. 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 2 dari 4.

Berapa lama pelajaran “Merancang DSL Kueri Fluent” 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. Apa Itu DSL Tingkat Jenis
  2. Merancang DSL Kueri Fluent
  3. Validasi Input Saat Kompilasi
  4. Pesan Error dalam DSL Tingkat Jenis
← Kembali ke TypeScript Academy