---
# System prepended metadata

title: TypeScript 3.8 -> 3.9 で死んだ話

---

# TypeScript 3.8 -> 3.9 で死んだ話 

## 概略
- バージョンアップでIntersection(交差型)とOptionalが絡むときの型チェックが厳しくなった
    - Breaking Changes: [Stricter Checks on Intersections and Optional Properties](https://github.com/microsoft/TypeScript/wiki/Breaking-Changes#stricter-checks-on-intersections-and-optional-properties)
    - (たぶん)この変更を受けて、今まで通ってたコードが通らなくなった

## 環境
- next.js と next-redux-wrapper と express を利用
    - next-redux-wrapper は、next.jsにおいてSSR時にredux storeのデータを使えるようにするための高階コンポーネント
    - next.js本家のexampleにも載ってる
- next-redux-wrapperで提供されているGetServerSidePropsContext型(req, res, queryなど)を、Expressの提供する型に合わせて拡張していた

## 文字じゃわかりにくいので例を
以下のコードはTS3.8ではエラーにならないが、3.9ではエラーになる
```typescript=
// http.d.ts により規定されているリクエストオブジェクトの型(一部抜粋)
interface IncomingMessage {
  aborted: boolean;
  httpVersion: string;
  httpVersionMajor: number;
  httpVersionMinor: number;
};
// next, next-redux-wrapperが提供する型
interface GetServerSidePropsContext {
  req: IncomingMessage;
}
// expressが提供する型(一部抜粋)
interface ExpressRequest extends IncomingMessage {
  accepts(): string[];
  acceptsCharsets(): string[];
  session?: string;
}

// next-redux-wrapperライブラリで定義されている関数(型だけ合わせて処理は適当)
// getServerSidePropsメソッドのコールバック引数の型に注目
const wrapper = {
  getServerSideProps: (callback: (arg: GetServerSidePropsContext & { store: string; } ) => boolean): void => {
    console.log(callback);
  }
};

// 自分でライブラリの型を拡張しているところ
type ExGetServerSidePropsContext = GetServerSidePropsContext & {
  req?: ExpressRequest;
  store?: string;
}

// コールバックの引数型を以下のように指定
// 3.8だとOKだが3.9だとエラーになる
wrapper.getServerSideProps(({ req }: ExGetServerSidePropsContext) => {
  return !!req.session;
});
```
[playgroundのリンク](https://www.typescriptlang.org/play/?ssl=1&ssc=1&pln=37&pc=4#code/PTAEAsBdIBwOgCZ0gZ1IawZARDIKIZDxkYLO1BVBkBiGQMwZARBkGiGQK4ZB6hkAqGQToZAJhkCqGQNYZAOhkHKGW5wOwZA0eoAKQABygC4TAOUaBonwCUAKACWAO0gBTAE4AzAIYBjNaACSyvQHsAtioDmAWTUoUO64YDe80KB0AjMxvUIAFygvmYANmo6ygDcHhDQMABqmiiKZsrBKJAaNrGeULDJGqnptjoAVn7BygCuFt6aefGFKWnKtipVoLX1jfIAvrEg3WoAHpAANCPjALQaagg1ozMA7ho6MDCagDIMgAvGgNnygJoMlIJKqpq6BqAA4mqQAMqaAG6a94oIagAKGmYwKADC6XU41A7k88wAjsETOYrMo7A4nC5Yv15MMxjB5o49kcTmIpHIzuptPpDABRUaYxEAJTUEJqDkgoDG6mUCDQMMsNnsjmcbji+gMMFQwlkmWyNgA2gBdJqCtTCgHgHTFO4oUXinLwmVNFCItoAfk1uQG8jRYGULLmCyWq3Wm00gEuGQAlDOxHdRAOYM+EAlf4kCiUQBFqYAHU2EgkABgyARQZABAqgHiGQDaDKRAGeKgDAXQD2DIBLBMAyvoKYYuB7PV7vL4-P6AQ4ZAL0MgGGGQCTDPxAM0MgB+GQDXDIAFhkrtEAqPpBoToQAXNoA7t3k5mUWVAaw2Ww0oAAvKC4nnHhoXho3h9vr8UMFhHodGEwt59ABrLcq6zBW75peFtclgFAlmgABkoNAWT8amN8OioH6oFkM4APhCMxwkiZQxVAJ4zHeQC508TxhxQUC4DCMxrG3Xd9yPWQmlRQYzWGQArwMAMCUPRdN1qCEQAkhkAQ6NAFZ9QB1Bn9QALBkAZQZAFiGeRIAATy2UAKQvRdl1XYsN0Bc4QVnQSCxXIt1z+cTgSZZ8wVASEjX4yksRQWl6UZXVIHfDSsi1awUQIsBG1bdt+C7QQqMAU7lAGg5fhMEAMQZ0EAcGN8HNUAAGY4AADjDZiAHkAGkw22AKAE4QvoR0G3QQArBkoeRxwdDQ4AXGSRPk9VhFcNS6R-YIBLuITr1EhT73Gf9pyA1T5kgGoNGUUAAEIOshOA9UcNoURwoA)

## 結局どうしたか
まだ彷徨ってる、どうすればいいんだ、厳しい
[PR](https://github.com/microsoft/TypeScript/pull/37195/files?file-filters%5B%5D=.ts)見ればわかるかなあ……（意外にも変更箇所はかなりシンプルなのである）