# 例の鉄道アプリで型エラーと戦った話 ## ハマったポイント概略 - next.js × typescript × express × firebase(auth)で動くアプリ - expressの型を拡張し、req(HTTP Request)オブジェクトに`firebaseServer`(中身はfirebase-adminを初期化したオブジェクト)というプロパティを持たせようとした ## 型エラーになったコード ```javascript= server.use((req, _, next) => { req.firebaseServer = firebase; next(); }); ``` - 型拡張しているため、引数のreqはfirebaseServerというプロパティを持つ、拡張されたExpress.Requestオブジェクトになっている - そして`req.firebaseServer`と記述してもエディタはエラーを出さない - けどローカルサーバを起動すると型エラーを吐く(`Property 'firebaseServer' does not exist on type 'Request<ParamsDictionary, any, any, Query>'.`) ## 結局どうしたか - [Object.defineProperty](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty)でプロパティを追加した - ついでにミドルウェアとしてその部分の処理を切り出しといた ```javascript= const firebaseServer = (firebase: admin.app.App): express.RequestHandler => { return (req, _, next) => { Object.defineProperty(req, "firebaseServer", { value: firebase }); next(); }; }; ``` - express-sessionというパッケージはreqにsessionプロパティをうまく追加できてんな、と思って見に行ったらこんな感じだった(気がする)