Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
TypeScriptのクロージャで型エ ラーにハマった話
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Yuxki
September 28, 2024
26
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
TypeScriptのクロージャで型エ ラーにハマった話
TypeScriptのクロージャで型エラーにハマった話です。
Yuxki
September 28, 2024
More Decks by Yuxki
See All by Yuxki
N+1問題について調べてみた
yuxki
0
23
Conoha VPSでIaCはできる!!!
yuxki
0
220
個人ブログ作ってデプロイしました。
yuxki
0
58
チームでプロダクトを作る機会でタスクの自走に役立った、個人開発の経験や習慣。
yuxki
0
58
Featured
See All Featured
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
45k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
200
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
940
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.7k
Un-Boring Meetings
codingconduct
0
380
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.5k
Tell your own story through comics
letsgokoyo
1
1k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
540
Site-Speed That Sticks
csswizardry
13
1.4k
Rails Girls Zürich Keynote
gr2m
96
14k
Transcript
TypeScriptのクロージャで型エ ラーにハマった話 Yukihiro Uejo
自己紹介 • 自己紹介 ◦ エンジニア職への就職(アプリのバックエンド)を目指して、日々勉強中です。 経験者と初心者の中間くらいだと思ってます。(実務2年 →個人開発3年) ▪ 実務2年では、主にJavaとSQLで管理会計のWEBアプリを開発 ▪
個人開発では、主にセキュリティと VPSでオンプレっぽくインフラを勉強して いました。 ◦ Pythonでバックエンドの開発をやってます。 ▪ 最近はNext.jsとTypeScriptでフロントの開発もしています。 2
クロージャとは “クロージャは、組み合わされた(囲まれた)関数と、その周囲の状態(レキシ カル環境)への参照の組み合わせです。言い換えれば、クロージャは内側の関数 から外側の関数スコープへのアクセスを提供します。JavaScript では、関数 が作成されるたびにクロージャが作成されます。” クロージャ https://developer.mozilla.org/ja/docs/Web/JavaScript/Closure s mdn
web docsから引用
つまり • これはクロージャではなく const foo = () => { console.log(“Hello”)
} • これはクロージャ let bar = “Hello” const foo = () => { console.log(bar) }
Array.prototype.map()でも同じことが言える • これはクロージャではなく [1, 2, 3].map((value)=> {return value + 1})
• これはクロージャ let bar = 1 [1, 2, 3].map((value)=> {return value + bar})
ところで
Reactでは以下のような処理がよくある • Web APIでデータを取ってきて、データが取れてきている場合、取ってきた データを使ってmap()の中でReact.Nodeに変換する処理。 • TypeScirptになれていない自分は、↑のmap()の関数内で起こる型エラー にハマってしまった。 • retunする前に、データがundefinedでないことをチェックしているのに、
なぜ型エラーが起きる?
サンプルコード
// 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) }) }
結果からいうと • クロージャの中で型のチェックをする必要があった。
エラーが生じた理由 • map()だとしっくりこなかったが、以下のような変数の関数の代入だと理由がはっきりわか る。 let foo: string | undefined =
1 const bar = () => { foo.substring(1) } • barが実際に呼ばれるタイミングでは fooがundefinedになっている可能性は十分に考えら れるため、TypeScriptはfooの型をstringに確定することができない。 (というか多分TypeScript独自の挙動ではない)
まとめ • クロージャは内側の関数から外側の関数スコープへのアクセスできるもの。 • 外側の変数を内側の関数で参照する場合、外側で確定させた型は内側の関数 では利用できない。 • そのため、必要であればクロージャの中で型を確定させる必要がある。