reactjs - نوعهای GraphQL در Typescript بهعنوان ناشناخته تعریف میشوند وقتی توسط Relay کامپایل میشوند
من تازه با Typescript کار میکنم و متوجه شدهام که ناسازگاری در نحوه مدیریت نوعها بین اسکیمای GraphQL و نوعهای تولید شده توسط Relay وجود دارد.
در اینجا یک نمونه است:
in schema.graphql
"""
columns and relationships of "businesses"
"""
type businesses implements Node {
businessId: bigint!
name: String!
}
// in __generated__/Business_business.graphql
export type Business_business = {
readonly name: string;
readonly businessId: unknown;
readonly " $refType": "Business_business";
};
export type Business_business$data = Business_business;
export type Business_business$key = {
readonly " $data"?: Business_business$data;
readonly " $fragmentRefs": FragmentRefs<"Business_business">;
};
const BusinessFragment = graphql`
fragment Business_business on businesses {
name
businessId
}
`
type Props = {
fragmentRef: Business_business$key
}
const Business = ({ fragmentRef }: Props) => {
const business = useFragment(BusinessFragment, fragmentRef)
return (
<div>
<p>my html!</>
{/* I get the error: Type 'unknown' is not assignable to type 'number' for businessId */}
<ChildComponent businessId={business.businessId} />
</div>
)
}
interface Props {
businessId: number
}
const ChildComponent = ({ businessId }: Props) => {
return (
<p>my business id: {businessId}</p>
)
}
آیا تنظیمات اضافی وجود دارد که باید انجام دهم تا Relay نوعهای Hasura را درک کند؟ من مثال را از طریق مستندات Relay دنبال کردهام.
من این فرض را دارم که Relay در حال کامپایل bigint به number نیست.
بهروزرسانی
من نوع ستون را در Hasura از bigint به Int تغییر دادهام و این مشکل را حل کرد. آیا راهی وجود دارد که به Relay بگویم چگونه نوعهایی را که با آنها آشنا نیست، تطبیق دهد؟ در این مورد، تبدیل bigint به number کاملاً مناسب است.
پاسخ شماره ۱
پاسخ به بهروزرسانی شما: شما میتوانید customScalars را درون relay.config.js خود اضافه کنید. من همچنین از Hasura استفاده میکنم و این چیزی است که من تنظیم کردهام:
module.exports = {
// ... your other configs
customScalars: {
uuid: 'string',
int8: 'string',
bigint: 'string',
numeric: 'number',
varbit: 'string',
bit: 'string',
char: 'string',
varchar: 'string',
bool: 'boolean',
int: 'number',
int4: 'number',
float8: 'number',
timestamptz: 'string',
timetz: 'string',
jsonb: 'Record<string, unknown>',
_text: 'string',
date: 'string',
}
};
پاسخ شماره ۲
آیا نوع را از
// در __generated__/Business_business.graphqlوارد کردید؟آیا یک اشتباه تایپی وجود دارد؟؟ $key به typename اضافه شده است؟
type Props = { fragmentRef: Business_business$key }
