Upgrade to Pro — share decks privately, control downloads, hide ads and more …

TypeScriptのクロージャで型エ ラーにハマった話

Avatar for Yuxki Yuxki
September 28, 2024
18

TypeScriptのクロージャで型エ ラーにハマった話

TypeScriptのクロージャで型エラーにハマった話です。

Avatar for Yuxki

Yuxki

September 28, 2024
Tweet

Transcript

  1. 自己紹介 • 自己紹介 ◦ エンジニア職への就職(アプリのバックエンド)を目指して、日々勉強中です。 経験者と初心者の中間くらいだと思ってます。(実務2年 →個人開発3年) ▪ 実務2年では、主にJavaとSQLで管理会計のWEBアプリを開発 ▪

    個人開発では、主にセキュリティと VPSでオンプレっぽくインフラを勉強して いました。 ◦ Pythonでバックエンドの開発をやってます。 ▪ 最近はNext.jsとTypeScriptでフロントの開発もしています。 2
  2. つまり • これはクロージャではなく const foo = () => { console.log(“Hello”)

    } • これはクロージャ let bar = “Hello” const foo = () => { console.log(bar) }
  3. // 2分の1の確率でundefinedが入る let foo: undefined | string = ["ABC", undefined][Math.floor(Math.random()

    * 2)] // ここではエラーが発生する foo.substring(1) if (foo !== undefined) { // ここではエラーが発生しない foo.substring(1) } if (foo !== undefined) { [1, 2, 3].map((value) => { // ここではエラーが発生する foo.substring(value) }) }
  4. エラーが生じた理由 • map()だとしっくりこなかったが、以下のような変数の関数の代入だと理由がはっきりわか る。 let foo: string | undefined =

    1 const bar = () => { foo.substring(1) } • barが実際に呼ばれるタイミングでは fooがundefinedになっている可能性は十分に考えら れるため、TypeScriptはfooの型をstringに確定することができない。 (というか多分TypeScript独自の挙動ではない)