入力と出力の両方として使用したいオブジェクトタイプがいくつかあります。たとえば、通貨タイプや予約タイプなどです。
入力と出力の両方をサポートする型を持つようにスキーマを定義するにはどうすればよいですか?必要がない場合、コードを複製したくありません。また、通貨やステータスの列挙型など、入力のタイプが重複しないようにしたいと思います。
export const ReservationInputType = new InputObjectType({
name: 'Reservation',
fields: {
hotelId: { type: IntType },
rooms: { type: new List(RoomType) },
totalCost: { type: new NonNull(CurrencyType) },
status: { type: new NonNull(ReservationStatusType) },
},
});
export const ReservationType = new ObjectType({
name: 'Reservation',
fields: {
hotelId: { type: IntType },
rooms: { type: new List(RoomType) },
totalCost: { type: new NonNull(CurrencyType) },
status: { type: new NonNull(ReservationStatusType) },
},
});
GraphQL仕様では、オブジェクトと入力オブジェクトは別個のものです。引用 入力オブジェクトの仕様 :
フィールドでは、クライアントがクエリで渡す引数を定義して、その動作を構成できます。これらの入力は文字列または列挙型にすることができますが、これより複雑にする必要がある場合があります。
オブジェクト型は、ここでの再利用には不適切です。オブジェクトには、循環参照またはインターフェイスや共用体への参照を表すフィールドを含めることができるため、どちらも入力引数としての使用には適していません。このため、システムでは入力オブジェクトに別のタイプがあります。
入力オブジェクトは、一連の入力フィールドを定義します。入力フィールドは、スカラー、列挙、またはその他の入力オブジェクトのいずれかです。これにより、引数は任意に複雑な構造体を受け入れることができます。
実装は、単一の定義からオブジェクトと対応する入力オブジェクトを作成するための便利なコードを提供する場合がありますが、仕様では、それらは別個のものでなければならないことを示しています(Reservation
などの別個の名前を使用)およびReservationInput
)。
あなたはこのようなことをすることができます:
export const createTypes = ({name, fields}) => {
return {
inputType: new InputObjectType({name: `${name}InputType`, fields}),
objectType: new ObjectType({name: `${name}ObjectType`, fields})
};
};
const reservation = createTypes({
name: "Reservation",
fields: () => ({
hotelId: { type: IntType },
rooms: { type: new List(RoomType) },
totalCost: { type: new NonNull(CurrencyType) },
status: { type: new NonNull(ReservationStatusType) }
})
});
// now you can use:
// reservation.inputType
// reservation.objectType
これは私が私のプロジェクトのためにしたことです(うまくいきます):
const RelativeTemplate = name => {
return {
name: name,
fields: () => ({
name: { type: GraphQLString },
reference: { type: GraphQLString }
})
};
};
const RelativeType = {
input: new GraphQLInputObjectType(RelativeTemplate("RelativeInput")),
output: new GraphQLObjectType(RelativeTemplate("RelativeOutput"))
};