Menguasai Eden Treaty untuk type-safe end-to-end: setup client, type inference otomatis dari server ke client, autocomplete di IDE, dan kapan pakai Eden vs REST client biasa untuk berbagai use case.

Setelah di episode 8 kita mengintegrasikan Drizzle ORM, pada episode ini kita akan memahami fitur paling powerful dari ElysiaJS: Eden Treaty — lapisan client yang memungkinkan type safety end-to-end tanpa code generation.
Masalah utama dalam pengembangan full-stack TypeScript adalah gap antara tipe di server dan client. Dengan REST API tradisional, kalian harus mendefinisikan ulang tipe di client secara manual — atau menggunakan code generation yang menambah step dan menjaga sinkronisasi menjadi beban.
Eden Treaty menyelesaikan masalah ini dengan mengimpor tipe langsung dari server. Ketika kalian mengupdate tipe route di server, client otomatis mendapat update tanpa regenerasi apapun.
// server.ts
import { Elysia, t } from 'elysia'
const app = new Elysia()
.get('/user/:id', ({ params }) => ({
id: Number(params.id),
name: 'John',
}), {
params: t.Object({ id: t.String() }),
response: t.Object({
id: t.Number(),
name: t.String(),
})
})
.listen(3000)
export type app = typeof app// client.ts
import { treaty } from '@elysiajs/eden'
import type { app } from './server'
const client = treaty(app)Ketika kalian menulis kode client, IDE akan memberikan autocomplete untuk semua route, params, query, dan body — langsung dari tipe server:
// IDE akan suggest: /user/:id, /user, dll.
const { data } = await client.user.get({
params: { id: '123' }
})
// data otomatis typed: { id: number, name: string }Jika kalian mencoba mengakses property yang tidak ada di response type, TypeScript akan error di compile time:
const { data } = await client.user.get({ params: { id: '123' } })
console.log(data.email) // Error: Property 'email' does not existKetika kalian menambahkan field baru ke response di server, client otomatis mendapat field tersebut tanpa perubahan kode client.
// GET dengan query
const { data } = await client.search.get({ query: { q: 'hello' } })
// POST dengan body
const { data } = await client.user.post({
name: 'John',
email: 'john@example.com',
})
// PUT dengan params dan body
const { data } = await client.user.put({
params: { id: '123' },
body: { name: 'Jane' },
})| Aspek | Eden Treaty | REST Client |
|---|---|---|
| Type safety | End-to-end | Manual/code gen |
| Setup | Minimal | Perlu schema export |
| Multi-runtime | TypeScript only | Semua bahasa |
| Public API | Tidak cocok | Sangat cocok |
| Full-stack TS | Ideal | Overhead |
Note
Eden Treaty adalah pilihan ideal untuk full-stack TypeScript projects di mana server dan client menggunakan TypeScript. Untuk public API atau projects multi-bahasa, REST dengan OpenAPI documentation tetap lebih fleksibel.
Pada episode 9 ini, kalian telah memahami Eden Treaty — fitur yang membedakan ElysiaJS dari framework lain.
Inti yang harus dibawa pulang:
Di episode 10 selanjutnya kita akan memahami static files, serve, dan serialization — menyajikan file statis, custom serializer, file upload, dan streaming response. Sampai jumpa di episode 10!