---
# System prepended metadata

title: 例の鉄道アプリで型エラーと戦った話

---

# 例の鉄道アプリで型エラーと戦った話

## ハマったポイント概略
- 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プロパティをうまく追加できてんな、と思って見に行ったらこんな感じだった(気がする)