🚧

TypeScript環境のFastifyでパラメータを受け取る時にunknown型で取れない場合

2022/10/23に公開

ドキュメントを見ながら(見落とし)パラメータの型定義をしていたのですが、何故かconst { user } = request.queryとするとunknownだから取れないとエラーを吐かれ2週間。
VALORANTやったり原神をやったりして現実逃避をしていたのですがやっとこさ解決できました。

問題のコード
app.get<{
    Querystring: {
        user: string;
    }
}>("/test", async (request: FastifyRequest, reply: FastifyReply) =>{
    const { user } = request.query;
    reply.type(utils.ApplicationJson).code(200).send({ test: user });
});

結論

unknownで定義されている型定義で上書きしてしまっていた。

("/test", async (
-   request: FastifyRequest, 
+   request,
    reply: FastifyReply
) => {}

とするとあっさり治った。(ドキュメント通りにやった結果)

どうしてこうなったのか

request: FastifyRequestここが問題でした。FastifyRequestにはQuerystring: unknownとするように定義されていたようです。
型定義ファイルとにらめっこしたのですが型定義ファイルをたどった結果ジェネリクスぽかったのでてっきりapp.get<{}>のジェネリクスを吸って定義しているのだと思って大丈夫だと思っていた。
どうやら違ったようだ。。。。。。。。
関数の前においたジェネリクス(?)は無視されるみたい

ドキュメントをしっかりと読んだ結果、あれ。。。。FastifyRequestついてなくね??????????
そうですVSCodeの補完で探して型を当てていたのでエラー出ないし名前的にも大丈夫そうだと思ってたんですよ。。。。
素直にドキュメントに沿っておくべきだったと反省

あれそういえば型定義ファイルにあったジェネリクス。。。。。

request: FastifyRequest<{ Querystring: { user: string } }>

あ、、、、通った。。。。。。。
まあ確かに引数に指定してる型が急に関数のところについてるやつを吸うわけないか
というわけで色々とハマってしまった
ドキュメントちゃんと読もう!!!
終わり!! 最後までこんな駄文を読んでいただきありがとうございました!!!!

GitHubで編集を提案

Discussion