# Effect-TS คืออะไร? คู่มือ Functional TypeScript สำหรับ Production-Grade App 2026
TypeScript กลายเป็นภาษาหลักสำหรับ Backend JavaScript มาสักพักแล้ว แต่เมื่อระบบโตขึ้น ปัญหาเดิม ๆ ก็โผล่มา: Error handling ด้วย try/catch ที่กระจายทั่วทั้งโค้ด, Async/await ที่ยาก compose, Dependency Injection ที่ต้องเขียนเอง, และ Concurrency ที่จัดการผิดพลาดได้ง่าย
Effect-TS เป็น library ที่พยายามแก้ปัญหาเหล่านี้ทั้งหมดพร้อมกัน ด้วยแนวคิด Functional Programming สไตล์ Scala ZIO ที่ถูกแปลงมาให้ใช้งานใน TypeScript ได้อย่างเป็นธรรมชาติ ในปี 2026 Effect-TS กลายเป็น option ที่ทีม Production เริ่มพูดถึงมากขึ้น โดยเฉพาะระบบที่ต้องการความน่าเชื่อถือสูงและ Type-safety ระดับเทพ
บทความนี้จะพาไปรู้จัก Effect-TS ตั้งแต่แนวคิดพื้นฐาน ตัวอย่างการใช้งานจริง ข้อดีข้อเสีย และเมื่อไหร่ที่ควรหรือไม่ควรนำมาใช้ในทีมของคุณ
Effect-TS คืออะไร
Effect-TS คือ library ที่ทำให้เราสร้าง Program ที่เป็น "Effect" แบบ Lazy—หมายความว่าเราอธิบายว่าจะทำอะไร โดยยังไม่ทำจริง จนกว่าจะ `runPromise` หรือ `runSync` ดังนั้นเราสามารถ compose, retry, timeout, หรือ catch error ก่อนที่โค้ดจะรันจริงได้
```typescript
import { Effect } from "effect"
const program = Effect.gen(function* () {
const user = yield* fetchUser(123)
const orders = yield* fetchOrders(user.id)
return { user, orders }
})
Effect.runPromise(program).then(console.log)
```
ต่างจาก Promise ที่รันทันทีที่สร้าง Effect จะรันเมื่อเราสั่งรัน ทำให้จัดการ side effect ได้แม่นยำกว่ามาก
3 เสาหลักของ Effect-TS
1. Typed Errors ที่ Compile-time รู้ล่วงหน้า
แทนที่จะใช้ try/catch ที่ไม่รู้ว่า error ประเภทไหนจะเกิด Effect จะ type error ติดไปกับ Effect เสมอ
```typescript
class NotFoundError { readonly _tag = "NotFoundError" }
class NetworkError { readonly _tag = "NetworkError" }
const getUser = (id: number): Effect.Effect<User, NotFoundError | NetworkError> =>
// ...
```
TypeScript จะบอกได้ว่าโค้ดนี้อาจ fail ด้วย error อะไรได้บ้าง บังคับให้ handle หรือ propagate อย่างชัดเจน
2. Dependency Injection ผ่าน Context
แทนที่จะต้อง new class หรือใช้ DI framework แยก Effect มี Context/Service ในตัว
```typescript
class Database extends Effect.Tag("Database")<Database, {
query: (sql: string) => Effect.Effect<Row[]>
}>() {}
const getUsers = Effect.gen(function* () {
const db = yield* Database
return yield* db.query("SELECT * FROM users")
})
```
ตอนรัน ค่อย provide dependency—เหมาะกับ test, swap implementation, หรือ mock ได้อิสระ
3. Concurrency ที่ปลอดภัยและยกเลิกได้
```typescript
const parallel = Effect.all([
fetchUserData,
fetchProducts,
fetchNotifications
], { concurrency: 3 })
```
เมื่อ Effect ยกเลิก Fiber (Task) ทั้งหมดจะหยุดอย่างสะอาด ไม่ทิ้ง zombie process
เทียบ Effect-TS vs วิธีเดิม
| ความสามารถ | Promise + try/catch | Effect-TS |
|------------|---------------------|-----------|
| Typed Errors | ไม่มี | มี ครบที่ Compile-time |
| Retry / Timeout | เขียนเอง | Built-in |
| Dependency Injection | ต้องใช้ library เสริม | Built-in via Context |
| Cancellation | ยากมาก | Safe by default |
| Testability | Mock ยาก | Mock ง่ายผ่าน Layer |
| Learning Curve | ต่ำ | สูง |
ตัวอย่าง Retry + Timeout สำหรับ API Call
```typescript
import { Effect, Schedule, Duration } from "effect"
const robustFetch = fetchUser(id).pipe(
Effect.timeout(Duration.seconds(5)),
Effect.retry(Schedule.exponential(Duration.millis(200))),
Effect.catchTag("NotFoundError", () => Effect.succeed(null))
)
```
โค้ดไม่กี่บรรทัด ได้ behavior ระดับ enterprise: timeout 5 วินาที, retry แบบ exponential backoff, แล้ว fallback เป็น null เมื่อเจอ NotFoundError
Step-by-Step เริ่มต้น Effect-TS ในโปรเจคใหม่
Step 1: ติดตั้ง
```bash
npm install effect
```
Step 2: เปลี่ยนฟังก์ชัน async แรกเป็น Effect
เลือกฟังก์ชันเล็ก ๆ ที่ไม่ซับซ้อนเช่น `getUserById` แล้วลอง wrap ด้วย Effect.tryPromise
Step 3: สร้าง Service แรก
กำหนด Database, Logger, Config เป็น Service แล้ว inject ผ่าน Context
Step 4: ย้ายฟังก์ชันข้างเคียงทีละตัว
ไม่ต้อง Big Bang Rewrite Effect สามารถอยู่ร่วมกับโค้ด Promise เดิมได้ดี
Step 5: ตั้ง Testing ด้วย Layer
สร้าง Layer ที่ inject Mock Service ในการทดสอบ—ทำให้ Unit Test สะอาดมาก
ข้อดี-ข้อเสียของ Effect-TS ในปี 2026
ข้อดี
ข้อเสีย
เมื่อไหร่ควรใช้ Effect-TS
เมื่อไหร่ไม่ควรใช้
สรุป: เครื่องมือสำหรับทีมที่ต้องการ Control เต็มรูปแบบ
Effect-TS ไม่ใช่ Framework สำหรับทุกทีม แต่สำหรับระบบที่ต้องทำงานใน Production ระดับ Enterprise ที่ต้องการ Reliability และ Type-safety ขั้นสุด มันคือทางเลือกที่มี Value สูง
แนะนำให้เริ่มจาก service เล็ก ๆ ก่อน ลอง implement แค่ 1-2 module แล้วประเมินผล ถ้าทีมรับได้ค่อยขยาย หากต้องการคำปรึกษาเรื่องการออกแบบระบบ Backend ที่ Reliable สำหรับธุรกิจ ติดต่อทีม ADS FIT ได้ที่ contact@adsfit.co.th
---
อ่านเพิ่มเติม: [Laravel 12 New Features](/blog/laravel-12-new-features-streamlined-structure-upgrade-guide-sme-thailand-2026) · [Encore TS](/blog/encore-ts-typescript-backend-framework-infrastructure-as-code-guide-sme-thailand-2026) · [TanStack Start](/blog/tanstack-start-full-stack-react-framework-alternative-nextjs-guide-dev-thailand-2026)