0Pricing
TypeScript Academy · บทเรียน

ตัวแก้ไข GraphQL ที่ระบุชนิดด้วย GraphQL Code Generator

เขียนตัวแก้ไขด้วยชนิดข้อมูลนำเข้าและค่าที่ส่งกลับที่ถูกต้อง

ตัวแก้ไข GraphQL ที่ระบุชนิดด้วย GraphQL Code Generator เป็นบทเรียน TypeScript Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน TypeScript Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส TypeScript Academy มีบทเรียนทั้งหมด 4 บทเรียน

ปัญหาการกำหนดชนิดข้อมูลให้รีโซลเวอร์

รีโซลเวอร์ GraphQL เป็นฟังก์ชันทั่วไป แต่หากไม่มีลายเซ็นที่มีชนิดข้อมูล ก็ง่ายที่จะส่งคืนโครงสร้างที่ไม่ถูกต้อง เครื่องมือสร้างโค้ดจะสร้างชนิดข้อมูลของรีโซลเวอร์เพื่อบังคับให้ค่าที่ส่งกลับถูกต้อง

// Without typed resolvers — any type allowed
const userResolver = async (_, { id }) => fetchUser(id);

การเพิ่มปลั๊กอินรีโซลเวอร์

ติดตั้งและกำหนดค่า @graphql-codegen/typescript-resolvers เพื่อสร้างชนิดข้อมูลของแมปรีโซลเวอร์

npm install --save-dev @graphql-codegen/typescript-resolvers

codegen.yml สำหรับรีโซลเวอร์

เพิ่มเอาต์พุตของปลั๊กอินรีโซลเวอร์ควบคู่กับชนิดข้อมูล TypeScript พื้นฐาน

# codegen.yml
generates:
  src/generated/types.ts:
    plugins:
      - typescript
  src/generated/resolvers.ts:
    plugins:
      - typescript-resolvers

การใช้ ResolverMap ที่สร้างขึ้น

ใช้ชนิดข้อมูล Resolvers ที่สร้างขึ้นกับอ็อบเจ็กต์แมปรีโซลเวอร์ เพื่อความปลอดภัยของชนิดข้อมูลอย่างสมบูรณ์

import { Resolvers } from "./generated/resolvers";

const resolvers: Resolvers = {
  Query: {
    user: async (_, { id }) => fetchUser(id),
    // Return type enforced: must match User schema
  },
};

การกำหนดชนิดข้อมูลให้บริบท

ส่งชนิดข้อมูลบริบทของคุณให้กับเจเนอริก Resolvers เพื่อให้ฟังก์ชันรีโซลเวอร์ได้รับอ็อบเจ็กต์บริบทที่มีชนิดข้อมูล

interface Context { db: Database; user?: AuthUser; }

// codegen.yml
config:
  contextType: "src/context#Context"

// Generated: Resolvers<Context>
const resolvers: Resolvers<Context> = {
  Query: {
    me: (_, __, ctx) => ctx.user, // ctx: Context
  },
};

ชนิดข้อมูลตัวแมป

ชนิดข้อมูลตัวแมปช่วยให้คุณแมปชนิดข้อมูล GraphQL กับชนิดข้อมูลของโมเดลภายใน ทำให้รีโซลเวอร์ส่งคืนอ็อบเจ็กต์โดเมนของคุณแทนชนิดข้อมูลเอาต์พุตของ GraphQL ได้

# codegen.yml
config:
  mappers:
    User: "src/models#UserModel"

การกำหนดชนิดข้อมูลให้รีโซลเวอร์ของฟิลด์

รีโซลเวอร์ของแต่ละฟิลด์ในชนิดข้อมูลก็มีการกำหนดชนิดข้อมูลเช่นกัน รวมถึงอาร์กิวเมนต์พาเรนต์และบริบท

// Typed field resolver on User type
const resolvers: Resolvers<Context> = {
  User: {
    fullName: (parent) => `${parent.firstName} ${parent.lastName}`,
    // parent is UserModel (from mapper)
  },
};

มิวเทชันที่มีชนิดข้อมูล

รีโซลเวอร์ของมิวเทชันจะได้รับอาร์กิวเมนต์อินพุตที่มีชนิดข้อมูล ซึ่งสร้างมาจากชนิดข้อมูลอินพุตของสคีมา

// Schema: createUser(input: CreateUserInput!): User!
const resolvers: Resolvers = {
  Mutation: {
    createUser: (_, { input }) => {
      // input: CreateUserInput — fully typed
      return createUser(input.name, input.email);
    },
  },
};

การสมัครรับข้อมูลที่มีชนิดข้อมูล

รีโซลเวอร์ของการสมัครรับข้อมูลมีฟังก์ชัน subscribe และฟังก์ชัน resolve ซึ่งทั้งคู่ได้รับการกำหนดชนิดข้อมูลโดยเครื่องมือสร้างโค้ด

const resolvers: Resolvers = {
  Subscription: {
    messageAdded: {
      subscribe: () => pubsub.asyncIterator("MESSAGE_ADDED"),
      resolve: (payload) => payload.messageAdded, // typed
    },
  },
};

การรักษาความสอดคล้องของการสร้างโค้ด

เพิ่มฮุกก่อนสร้างหรือก่อนคอมมิตเพื่อสร้างชนิดข้อมูลของรีโซลเวอร์ใหม่เมื่อสคีมาเปลี่ยนแปลง ป้องกันไม่ให้ชนิดข้อมูลเก่าเข้าสู่ระบบจริง

// package.json
{
  "scripts": {
    "predev": "graphql-codegen",
    "prebuild": "graphql-codegen"
  }
}

ทบทวน: รีโซลเวอร์ที่มีชนิดข้อมูล

ปลั๊กอินสร้างโค้ด typescript-resolvers จะสร้างชนิดข้อมูล Resolvers ที่บังคับให้โครงสร้างค่าที่ส่งกลับ ชนิดข้อมูลอาร์กิวเมนต์ และโครงสร้างบริบทของรีโซลเวอร์ GraphQL ทั้งหมดถูกต้อง

ตรวจสอบอย่างรวดเร็ว

ตัวเลือกการกำหนดค่า contextType ทำหน้าที่อะไรในการสร้างโค้ด

สิ่งที่คุณได้เรียนรู้

รีโซลเวอร์ GraphQL ที่มีชนิดข้อมูลและสร้างด้วยเครื่องมือสร้างโค้ดจะบังคับให้ชนิดค่าที่ส่งกลับ โครงสร้างอาร์กิวเมนต์ และอ็อบเจ็กต์บริบทถูกต้องทั่วทั้งแมปรีโซลเวอร์ ใช้ชนิดข้อมูลตัวแมปสำหรับอ็อบเจ็กต์โดเมน และคงเครื่องมือสร้างโค้ดไว้ในกระบวนการสร้างของคุณเพื่อป้องกันความคลาดเคลื่อน

คำถามที่พบบ่อย

บทเรียน “ตัวแก้ไข GraphQL ที่ระบุชนิดด้วย GraphQL Code Generator” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ตัวแก้ไข GraphQL ที่ระบุชนิดด้วย GraphQL Code Generator” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส TypeScript Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส TypeScript Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ตัวแก้ไข GraphQL ที่ระบุชนิดด้วย GraphQL Code Generator”

เขียนตัวแก้ไขด้วยชนิดข้อมูลนำเข้าและค่าที่ส่งกลับที่ถูกต้อง คุณปฏิบัติ TypeScript Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน TypeScript Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน TypeScript Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “ตัวแก้ไข GraphQL ที่ระบุชนิดด้วย GraphQL Code Generator” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน TypeScript Academy นี้ได้ไหม

ได้ บทเรียน TypeScript Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. สคีมา GraphQL เป็นชนิด TypeScript
  2. ตัวแก้ไข GraphQL ที่ระบุชนิดด้วย GraphQL Code Generator
  3. ไคลเอนต์ GraphQL ที่ระบุชนิดด้วย Apollo และ urql
  4. ความปลอดภัยของชนิดตั้งแต่ต้นจนจบ: เวิร์กโฟลว์เริ่มจากสคีมา
← กลับไปที่ TypeScript Academy