# 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)見ればわかるかなあ……(意外にも変更箇所はかなりシンプルなのである)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up