[解決済み] Apollo Serverでコンテキストオブジェクトを正しく入力するにはどうすればよいですか?
質問事項
を使っています。
APOLLOサーバー
をtypescriptで記述した場合、リゾルバ内のコンテキストパラメータに
name
プロパティの
context
は文字列です。今は、次のように入力されています。
any
と入力したい。
string
. また
context
パラメータは、特定のインターフェイスであって欲しいのに、anyタイプになっています。コンテキストとそのプロパティに、どのような型にしたいかを伝える方法はないでしょうか。
any
?
const server = new ApolloServer({
typeDefs: gql`
type Query {
test: String
}
`,
resolvers: {
Query: {
test(parent: any, args: any, context, info: any) {
context.name // name is typed as "any" when I'd like it to be typed as "string"
}
}
},
context() {
return {
name: 'John Doe'
}
}
})
こんな感じでやってみたんですが、これだとエラーが出ますね。
context<{ name: string }>() {
return {
name: 'John Doe'
}
}
コンテキストに必要なものを明示的に伝えることで動作させることはできましたが、この方法では
Context
をすべてのリゾルバファイルに追加し、手動でキャストしています。
interface Context {
name: string
}
const server = new ApolloServer({
...
resolvers: {
Query: {
test(parent: any, args: any, context: Context, info: any) {
context.name // name is typed as "string" here because I used "context: Context" explicitly
}
}
}
...
})
解決方法は?
デフォルトでは
resolvers
フィールドの
Config
オブジェクトに与えます。
ApolloServer
はどんな型にも対応していますが、TypeScriptを使って独自の型の絞り込みを行うことができます。
参考までに
ApolloServer
のインスタンスまたは配列を受け取ります。
IResolvers
オブジェクトを指定します。
https://github.com/apollographql/apollo-server/blob/a241d34e9275bf6a23cf7aa3ddee57f90de7b364/packages/apollo-server-core/src/types.ts#L90
.
IResolvers
は一般的な型パラメータを持ちますが、それらのデフォルトはanyです。
https://github.com/ardatan/graphql-tools/blob/8c8d4fc09ddc63c306db16d7386865ac297794bd/packages/utils/src/Interfaces.ts#L298
. あなたのコードサンプルでは
Query
を構成する特定の型の一つである。
IResolvers
と
test()
を実装しています。
IFieldResolver
:
https://github.com/ardatan/graphql-tools/blob/8c8d4fc09ddc63c306db16d7386865ac297794bd/packages/utils/src/Interfaces.ts#L236
.
ということを利用することができます。
IResolvers
の型を制限するためのジェネリックパラメータがあります。
context
の引数になります。例えば、代入の左辺で明示的に型を指定することで、右辺で何を期待するかをコンパイラに伝えることができる。
interface Context {
username: string
}
const myResolvers: IResolvers<any, Context> = {
Query: {
test: (parent, args, context) => {
console.log(context.username) // based on generics TS knows context is supposed to be of type Context
}
}
}
new ApolloServer({
...
resolvers: myResolvers,
...
関連
-
[解決済み] プロパティ 'values' はタイプ 'ObjectConstructor' に存在しません。
-
[解決済み] フォーインステートメント
-
[解決済み] TypeScriptでオブジェクトに動的にプロパティを割り当てるには?
-
[解決済み] Typescript オブジェクトのインデックス付きメンバの型を強制する?
-
[解決済み] Typescript は ?演算子をサポートしていますか?(そして、それは何と呼ばれているのでしょうか?)
-
[解決済み] TypeScriptのオブジェクトリテラルでの型定義
-
[解決済み] 'unknown' vs. 'any'
-
[解決済み] noImplicitAnyフラグを有効にしてtypescriptをコンパイルすると、"Index signature of object type implicitly has an 'any' type "というエラーが発生しますが、どうすれば防ぐことができますか?
-
[解決済み] TypeScriptのファイル変更時にts-nodeを監視して再読み込みする方法
-
[解決済み】WebStorm/PhpStormのダブルクォートでTypeScriptの自動インポートを行う。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] TypeScriptエラー TS1005: ';' が予想される (II)
-
[解決済み] Apollo Serverでコンテキストオブジェクトを正しく入力するにはどうすればよいですか?
-
[解決済み] eslintをtypescriptで使用する - モジュールへのパスを解決できない
-
[解決済み] TSがモジュールを見つけ出せない
-
[解決済み] 'タイプ 'never'にプロパティが存在しません。
-
[解決済み] エラー TS2345: 型 'T' の引数は型 'object' のパラメータに代入できません。
-
[解決済み] TypeScriptで文字列を数値に変換する方法とは?
-
[解決済み] TypeScriptの "*.d.ts "について
-
[解決済み】Visual Studio Codeで.js.mapファイルを非表示にする方法
-
[解決済み】オブジェクトの配列を定義するにはどうしたらいいですか?