انتقل إلى المحتوى

تحويل GraphQL إلى أنواع Flow — Numio

يُنشئ تعريفات أنواع Flow من مخطط GraphQL وعملياته باستخدام @graphql-codegen/flow وflow-operations. تصبح أنواع الكائنات كائنات Flow دقيقة ({| |})، وتصبح الحقول القابلة لـ null أنواع maybe اختيارية (?T).

إضافة نتائج GraphQL مُنمَّطة إلى قاعدة شيفرة لا تزال تُفحص أنواعها بـ Flow بدلًا من TypeScript.

GraphQL Schema

Document

متى تستخدمها

  • إضافة نتائج GraphQL مُنمَّطة إلى قاعدة شيفرة لا تزال تُفحص أنواعها بـ Flow بدلًا من TypeScript.
  • إنشاء أنواع المتغيرات والنتيجة لاستعلام واحد للصقها بجوار مكوّن.

طريقة الاستخدام

  1. الصق SDL الخاص بالمخطط في محرر GraphQL Schema.
  2. أدخل العمليات التي تستخدمها في محرر Document، أو أفرغه إذا كنت تحتاج أنواع المخطط فقط.
  3. انسخ المخرجات التي تبدأ بـ // @flow إلى ملف .js يخضع لـ Flow.

مخطط GraphQL + document

# GraphQL Schema editor
type Query {
  user(id: ID!): User
}

type User {
  id: ID!
  name: String
  tags: [String!]!
}

# Document editor
query GetUser($id: ID!) {
  user(id: $id) { id name }
}

أنواع Flow

// @flow
…
export type User = {|
  __typename?: "User",
  id: $ElementType<Scalars, "ID">,
  name?: ?$ElementType<Scalars, "String">,
  tags: Array<$ElementType<Scalars, "String">>,
|}

export type GetUserQueryVariables = {
  id: $ElementType<Scalars, "ID">,
}

export type GetUserQuery = {
  ...{ __typename?: "Query" },
  ...{|
    user?: ?{
      ...{ __typename?: "User" },
      ...$Pick<User, {| id: *, name?: * |}>,
    },
  |},
}

التفاصيل والقيود

تشير الحقول إلى الأنواع العددية عبر $ElementType<Scalars, "ID">؛ ونوع Scalars في البداية (محذوف أعلاه) يربط ID وString بـ string، وInt وFloat بـ number.

تُبنى أنواع نتائج العمليات من object spread ومساعد $Pick محلي، فلا يظهر إلا الحقول المحددة.

يجري الإنشاء في Web Worker داخل متصفحك وتُنسَّق النتيجة بـ Prettier؛ ولا توجد خيارات للإضافة في الصفحة.

FAQ

هل أنواع الكائنات المُنشأة دقيقة (exact)؟

نعم. تستخدم أنواع كائنات المخطط صيغة الكائن الدقيق {| ... |}، لذا يرفض Flow الخصائص الإضافية.

كيف تُمثَّل الحقول القابلة لـ null؟

يصبح الحقل القابل لـ null خاصية اختيارية بنوع maybe، مثل name?: ?$ElementType<Scalars, "String">. أما الحقول غير القابلة لـ null فمطلوبة وليست من نوع maybe.

لماذا تحتوي المخرجات على تعليق "Document ignored"؟

تُتحقق العمليات في محرر Document مقابل المخطط. إذا لم تتطابق (المثال الافتراضي يستعلم عن username)، تُنشأ أنواع المخطط فقط ويظهر أول خطأ كتعليق أسفل // @flow. عدّل المستند أو أفرغه.

المواصفات والمراجع