تولید کد - بازنویسی از نوعهای Typescript تولید شده از طرحبندی GraphQL
من از graphql-code-generator برای تولید انواع تایپاسکریپت از اسکیمای GraphQL خود استفاده میکنم. در GraphQL شما میتوانید انواع اسکالر سفارشی ایجاد کنید که نوع زیر را تولید میکند: /graphql.ts
export type Scalars = {
String: string;
Boolean: boolean;
NodeDescription: any;
};
export type CodeResource = {
ast: Scalars["NodeDescription"];
};
همانطور که میبینید، نوعهای اسکالر پیشفرض GraphQL مانند String، Boolean و غیره، به نوع معادل خود در Typescript نگاشت میشوند. نوعهای اسکالر سفارشی مانند NodeDescription به نوع Typescript any تبدیل میشوند.
در کلاینت Angular من قبلاً یک نوع NodeDescription وجود دارد (در ../app/shared/syntaxtree) که میخواهم به جای نوع تولید شده any از آن استفاده کنم. آیا راهی وجود دارد که فیلد NodeDescription را در نوع Scalars بازنویسی کنم؟ بنابراین در نهایت من میخواهم فیلد ast از نوع تولید شده CodeResource نوع NodeDescription را داشته باشد به جای any.
اولین ایده من این بود که نوع Scalars["NodeDescription"] را با NodeDescription بازنویسی کنم. بنابراین سعی کردم همه نوعها را در یک فایل جدید وارد کنم و آنها را به این شکل بازنویسی کنم: /types.ts
import {Scalars} from "./graphql";
import {NodeDescription} from "../app/shared/syntaxtree";
type Overwrite<T, U> = Pick<T, Exclude<keyof T, keyof U>> & U;
type Scalar = Overwrite<Scalars, {NodeDescription: NodeDescription}>
این در واقع کار میکند، اما فیلد ast از نوع CodeResource هنوز از نوع any است.
یک ایده دیگر این است که از یک اسکریپت بش همراه با یک دستور sed طراحیشده استفاده کنید تا فایل ایجاد شده به این صورت ویرایش شود:
import {NodeDescription} from "../app/shared/syntaxtree";
export type Scalars = {
String: string;
Boolean: boolean;
NodeDescription: NodeDescription;
};
با این حال قبل از اینکه آن روش را پیادهسازی کنم، میخواهم بدانم آیا راه هوشمندانهای در تایپاسکریپت برای بازنویسی نوعهای تولید شده وجود دارد. ممنون از کمک.
پاسخ شماره ۱
من یک راه حل خاص پیدا کردم اگر شما هم با مشکل مشابهی هنگام استفاده از graphql-code-generator مواجه هستید. یک پلاگین به نام add وجود دارد. بنابراین در فایل codegen.yml میتوانید ایمپورتها را اضافه کرده و به انواع scalar سفارشی رسیدگی کنید. فایل codegen.yml من اکنون به این شکل است:
overwrite: true
schema: "../schema/graphql/schema.json"
documents: "../schema/graphql/**/*.graphql"
generates:
src/generated/graphql.ts:
plugins:
- "typescript"
- "typescript-operations"
- "typescript-apollo-angular"
- add:
content: 'import { NodeDescription } from "../app/shared/syntaxtree";'
config:
enumsAsTypes: true
scalars:
NodeDescription: NodeDescription
ISO8601DateTime: string
