Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
意外と難しいGraphQLのスカラー型
Search
uhyo
September 22, 2025
Technology
5
860
意外と難しいGraphQLのスカラー型
2025-09-22 『TypeScriptのスキーマ駆動開発』実践事例 LT
uhyo
September 22, 2025
Tweet
Share
More Decks by uhyo
See All by uhyo
Claude Code 10連ガチャ
uhyo
3
650
AI時代、“平均値”ではいられない
uhyo
8
3k
RSCの時代にReactとフレームワークの境界を探る
uhyo
13
4.4k
知られざるprops命名の慣習 アクション編
uhyo
12
3.2k
libsyncrpcってなに?
uhyo
0
720
Next.jsと状態管理のプラクティス
uhyo
7
16k
10ヶ月かけてstyled-components v4からv5にアップデートした話
uhyo
5
680
更新系と状態
uhyo
9
3.9k
React 19アップデートのために必要なこと
uhyo
8
2.9k
Other Decks in Technology
See All in Technology
Flutter DevToolsで発見! 本番アプリのパフォーマンス問題と改善の実践
goto_tsl
1
330
[JDDStudy #10] 社内Agent勉強会の取り組み紹介
yp_genzitsu
1
130
エンジニアにとってコードと並んで重要な「データ」のお話 - データが動くとコードが見える:関数型=データフロー入門
ismk
0
450
コンピューティングリソース何を使えばいいの?
tomokusaba
1
130
Flutterで実装する実践的な攻撃対策とセキュリティ向上
fujikinaga
1
320
ある編集者のこれまでとこれから —— 開発者コミュニティと歩んだ四半世紀
inao
1
220
Datadog On-Call と Cloud SIEM で作る SOC 基盤
kuriyosh
0
160
フライトコントローラPX4の中身(制御器)を覗いてみた
santana_hammer
1
140
CDKの魔法を少し解いてみる ― synth・build・diffで覗くIaCの裏側 ―
takahumi27
1
110
Dart and Flutter MCP serverで実現する AI駆動E2Eテスト整備と自動操作
yukisakai1225
0
310
AWS 環境で GitLab Self-managed を試してみた/aws-gitlab-self-managed
emiki
0
350
Spring Boot利用を前提としたJavaライブラリ開発方法の提案
kokihoshihara
PRO
2
110
Featured
See All Featured
Building a Modern Day E-commerce SEO Strategy
aleyda
45
8k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
1.1k
Why Our Code Smells
bkeepers
PRO
340
57k
Practical Orchestrator
shlominoach
190
11k
How GitHub (no longer) Works
holman
315
140k
How to train your dragon (web standard)
notwaldorf
97
6.4k
Raft: Consensus for Rubyists
vanstee
140
7.2k
YesSQL, Process and Tooling at Scale
rocio
174
15k
Side Projects
sachag
455
43k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.5k
Automating Front-end Workflow
addyosmani
1371
200k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
15k
Transcript
意外と難しいGraphQLのスカラー型 2025-09-22『TypeScriptのスキーマ駆動開発』実践事例 LT
発表者紹介 uhyo 株式会社カオナビ フロントエンドエキスパート 前職ではGraphQLを使っていた。 2
注意 この話は、GraphQL + TypeScriptの定番ツール GraphQL Codegen よりも安全性にこだわった自作ツール nitrogql が流行らないことの恨み節です。 3
GraphQLとTypeScriptの型の関係 GraphQLには、型の概念が存在する。 String, Int, Boolean 型など。 TypeScriptのコード生成をする場合、GraphQLの型を TypeScriptの型に対応付ける必要がある。 例: String→string
Int→number 4 GraphQLの型 TypeScriptの型
注意が必要なID型 ID型もGraphQLに組み込みの型だが、 特殊な性質を持つ。 •文字列としてシリアライズされる。 •しかし、ID型の入力としては整数も受け付ける。 5
注意が必要なID型 ID → string ? ID → string | number
? 6
注意が必要なID型 const data = useQuery({ query, variables: { inputId: 12345
}, }); data.outputId 7 このIDは string | number になるのが望ましい (シリアライズ前のため) このIDは string になるのが望 ましい (シリアライズ済のため)
GraphQL Codegenでは…… 状況に応じてID型に対応するTypeScriptの型を 出し分ける必要がある。 ところが、GraphQL Codegenは一律で string型を出力。(デフォルトの設定の場合) 本来numberが使えるはずの場面で使わせて くれない! 8
設定を変えればいける こんな設定を書けばGraphQL Codegenでも 出し分けが可能。 scalars: { ID: { input: ‘string
| number’, output: ‘string’ } } 9
GraphQL Codegenでの出し分け const data = useQuery({ query, variables: { inputId:
12345 }, }); data.outputId 10 ここではinput用の型を使用 (string | number) ここではoutput用の型を使用 (string)
めでたし……と思いきや サーバー側(GraphQLのリゾルバー定義) 向けの型もGraphQL Codegenで出力すると…… deleteUser: (_, { id }) =>
{ return userStore.delete(id); } 11
めでたし……と思いきや サーバー側(GraphQLのリゾルバー定義) 向けの型もGraphQL Codegenで出力すると…… deleteUser: (_, { id }) =>
{ return userStore.delete(id); } 12 入力なのでinput用の型が使用 されるが、正しい型はstring (string | numberではない!) ※逆に、resolverの実装から出力されるIDは string | number型が正しい
GraphQL Codegen向けの正しい設定 こうする必要がある。 どうしてこうなった…… scalars: { //クライアント用 ID: { input:
‘string | number’, output: ‘string’ } } 13 scalars: { //サーバー用 ID: { input: ‘string’, output: ‘string | number’ } }
一方nitrogqlでは input/outputではなくsend/receiveという分けを 導入することで、両者で共通の定義にできる。 scalarTypes: { //クライアント・サーバー共通 ID: { send: ‘string
| number’, receive: ‘string’ } } 14
まとめ GraphQL CodegenはGraphQL + TypeScript向け のデファクトスタンダードなツールだが、 型安全に使うために適切に設定する難易度が とても高い。気を付けよう。 15