Development

Effect-TS คืออะไร? คู่มือ Functional TypeScript สำหรับ Production-Grade App 2026

Effect-TS เปลี่ยนวิธีเขียน TypeScript ด้วย Functional Programming จัดการ Error, Concurrency, Dependency Injection ครบชุด พร้อมตัวอย่างใช้งานจริงสำหรับทีม Dev ไทยปี 2026

AF
ADS FIT Team
·8 นาที
Share:

# 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

ข้อดี

  • **Type-safety ระดับสูงสุด**: Error และ Dependency ปรากฏใน type ทั้งหมด
  • **Composability**: pipe, flatMap, zip compose Effect ได้อย่างสะอาด
  • **Built-in Observability**: Logging, Tracing, Metrics รองรับในตัว
  • **Ecosystem โตเร็ว**: @effect/platform, @effect/schema, @effect/sql พร้อมใช้
  • ข้อเสีย

  • **Learning Curve สูง**: ทีมที่ไม่คุ้น Functional Programming อาจใช้เวลา 2-4 สัปดาห์
  • **Community เล็กกว่า**: เทียบกับ Express, NestJS ยังน้อย
  • **Verbose สำหรับงานง่าย**: ถ้าแค่สคริปต์ CRUD ธรรมดา Effect อาจ over-engineer
  • **Bundle Size**: ใหญ่กว่าทางเลือก minimal เช่น Neverthrow
  • เมื่อไหร่ควรใช้ Effect-TS

  • ระบบ Backend ที่ต้องการ Reliability สูง เช่น Payment, Booking, Healthcare
  • Microservice ที่มี Network Call ซับซ้อน ต้อง Retry/Timeout/Circuit Breaker
  • ทีมที่ทำ TypeScript ระดับลึก คุ้นเคย Functional Programming หรือ ZIO/Cats Effect
  • Project ที่ต้องการ Testability ระดับสูง
  • เมื่อไหร่ไม่ควรใช้

  • Landing page หรือเว็บ Static
  • ทีมที่เพิ่งเริ่ม TypeScript หรือยัง Junior มาก
  • Prototype ที่ต้องส่งใน 1 สัปดาห์
  • โปรเจคที่ Codebase เป็น Promise อยู่แล้วและยังไม่มีปัญหา
  • สรุป: เครื่องมือสำหรับทีมที่ต้องการ 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)

    Tags

    #Effect-TS#TypeScript#Functional Programming#Node.js#Error Handling#SME Thailand

    สนใจโซลูชันนี้?

    ปรึกษาทีม ADS FIT ฟรี เราพร้อมออกแบบระบบที่ฟิตกับธุรกิจของคุณ

    ติดต่อเรา →

    บทความที่เกี่ยวข้อง