カテゴリー
TypescriptでGraphQL Code Generatorから自動生成されるクエリ宣言から部分型を抽出する
※ 当ページには【広告/PR】を含む場合があります。
2024/09/14
query GetHoge {
hoge {
piyo {
fuga {
mofu
}
}
}
}
graphql-codegen
type GetHogeQuery = {
__typename?: 'Query';
hoge: {
__typename?: 'Hoge';
piyo: Array<{
__typename?: 'Piyo';
fuga: Array<{
__typename?: 'Fuga';
mofu: string;
}>
}>
}
}
graphql-codegen
{__typename?: string}
T extends {__typename?: string}
(T extends {__typename?: string})[]
自動生成したGraphQLスキーマ型の部分型を取り出す手順
extractTypeName
type extractTypeName<T, __typename = ''> = T extends {[key in string]?: infer U;} ?
U : T extends (infer R)[] ?
R: never;
type GetHogeQuery = {
__typename?: 'Query';
hoge: {
__typename?: 'Hoge';
piyo: Array<{
__typename?: 'Piyo';
fuga: Array<{
__typename?: 'Fuga';
mofu: string;
}>
}>
}
};
type Q1 = extractTypeName<GetHogeQuery>;
//👇
// type Q1 = "Query" | {
// __typename?: "Hoge";
// piyo: Array<{
// __typename?: "Piyo";
// fuga: Array<{
// __typename?: "Fuga";
// mofu: string;
// }>;
// }>;
// }
type Q2 = extractTypeName<Q1>;
//👇
// type Q2 = "Hoge" | {
// __typename?: "Piyo";
// fuga: Array<{
// __typename?: "Fuga";
// mofu: string;
// }>;
// }[]
type Q3 = extractTypeName<Q2>;
//👇
// type Q3 = {
// __typename?: "Piyo";
// fuga: Array<{
// __typename?: "Fuga";
// mofu: string;
// }>;
// }
type Q4 = extractTypeName<Q3>;
//👇
// type Q4 = "Piyo" | {
// __typename?: "Fuga";
// mofu: string;
// }[]
type Q5 = extractTypeName<Q4>;
//👇
// type Q5 = {
// __typename?: "Fuga";
// mofu: string;
// }
type Q6 = extractTypeName<Q5>;
//👇
// type Q6 = string
extractTypeName
extractTypeName
type extractTypeName<T, __typename = ''> = T extends |
{[key in string]?: infer U;} | (infer U)[] ?
U: never;
__typename
__typename
type extractTypeName<T, __typename = ''> = T extends |
{[key in string]?: infer U;} | (infer U)[] ?
U extends { __typename?: __typename }?
U: never
:never;
type Q1 = extractTypeName<GetHogeQuery,'Hoge'>;
//👇
// type Q1 = {
// __typename?: "Hoge";
// piyo: Array<{
// __typename?: "Piyo";
// fuga: Array<{
// __typename?: "Fuga";
// mofu: string;
// }>;
// }>;
// }
type Q2 = extractTypeName<Q1>;
//👇
//type Q2 = never
__typename
type extractTypeName<T, __typename = ''> = T extends |
{[key in string]?: infer U;} | (infer U)[] ?
U extends { __typename?: __typename }?
U: extractTypeName<U, __typename>
:never;
type Q1 = extractTypeName<GetHogeQuery,'Hoge'>;
//👇
// type Q1 = {
// __typename?: "Hoge";
// piyo: Array<{
// __typename?: "Piyo";
// fuga: Array<{
// __typename?: "Fuga";
// mofu: string;
// }>;
// }>;
// }
type Q2 = extractTypeName<GetHogeQuery, 'Piyo'>;
///👇
// type Q2 = {
// __typename?: "Piyo";
// fuga: Array<{
// __typename?: "Fuga";
// mofu: string;
// }>;
// }
type Q3 = extractTypeName<GetHogeQuery, 'Fuga'>;
//👇
// type Q3 = {
// __typename?: "Fuga";
// mofu: string;
// }
まとめ
記事を書いた人
ナンデモ系エンジニア
主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。
カテゴリー