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
ぼくのかんがえたさいきょうの放置ゲームを作ってる話 / saikyou-houti-game
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
kthatoto
June 28, 2021
Programming
480
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ぼくのかんがえたさいきょうの放置ゲームを作ってる話 / saikyou-houti-game
kthatoto
June 28, 2021
More Decks by kthatoto
See All by kthatoto
複数ブラウザウィンドウを 単一平面とみなしてボールの 衝突判定をする
kthatoto
0
210
CSSだけでCookie Clickerを作る
kthatoto
0
1.1k
いろいろな駆動開発の話 / various-driven-development
kthatoto
0
98
最強の放置ゲームを作ってる話 ~ と、そのうちのゲーム作るためのゲームデータエディタを作ってる話 ~
kthatoto
0
73
ぼくのかんがえたさいきょうのぶろぐしすてむ
kthatoto
0
740
Other Decks in Programming
See All in Programming
「なぜそう決めたのか」を残し続ける仕組み ― Notion AI カスタムエージェント × Slack連携による設計判断の自動記録 - NIKKEI Tech Talk #47
niftycorp
PRO
0
170
Even G2とAWSで推しのエージェントを召喚しよう!
har1101
1
110
AI時代の仕事技芸論 — ソフトウェア開発で「遊ぶように働く」職人的熟達のすすめ
kuranuki
2
680
ユニットテストの先へ:テスト技法で要求・仕様を整理するJava開発実践 / Beyond_Unit_Testing_Practical_Java_Development_Techniques_for_Organizing_Requirements_and_Specifications
shimashima35
0
400
Honoでのサプライチェーン侵害対策 〜 3つのライブラリに学ぶ
yusukebe
4
800
Lessons from Spec-Driven Development
simas
PRO
0
190
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
3
3.9k
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
350
Signal Forms: Beyond the Basics @ngBaguette 2026 in Paris
manfredsteyer
PRO
0
250
CSC307 Lecture 17
javiergs
PRO
0
320
スマートグラスで並列バイブコーディング
hyshu
0
140
[2026年度第1回ORセミナー] 計画最適化ベンチャーと競技プログラミング人材
terryu16
0
260
Featured
See All Featured
WCS-LA-2024
lcolladotor
0
630
Typedesign – Prime Four
hannesfritz
42
3.1k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.3k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
300
Designing for Performance
lara
611
70k
Optimising Largest Contentful Paint
csswizardry
37
3.7k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
410
Designing Powerful Visuals for Engaging Learning
tmiket
1
410
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
230
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
940
Making the Leap to Tech Lead
cromwellryan
135
9.9k
How STYLIGHT went responsive
nonsquared
100
6.2k
Transcript
"΅͘ͷ͔Μ͕͍͖͑ͨ͞ΐ͏ͷ์ஔήʔϜ" Λ࡞ͬͯΔ ͍ͯಘͨݟͷ by @kthatoto
ࣗݾհ ͱ ɾTwitterɿ@kthatoto ɾVue, Nuxt, TypeScript, Ruby, Rails, Go ɹFirebase,
AWS ɾझຯɿLTۦಈ։ൃ, ์ஔήʔϜ ɾΤϯδχΞ6 ɾࠇ͍ը໘͔ͬ͜Α͖ͯ͘Ͱ͢ ɾVue Composition API ͕͖Ͱ͢ ɹ (ྺ1ͪΐ͍)
͢༰ ʔ ์ஔήʔϜʹ͍ͭͯ ʔ ࣗ࡞์ஔήʔϜ(Λࢦͨ͠ͷ)ͷφϯόϦϯάλΠτϧͷհ ʔ Vue Composition APIͷType Error͔ΒֶͿ
Generics, Conditional Types, infer
์ஔήʔϜͬͯ·͔͢ʁ ༗໊ͳͷ Cookie Clicker খֶੜ࣌ͷ์ஔήʔϜ ҭͯʹ༬͚ͯΞΠεͷΛચ୕όαϛͰ ڬΜͰ্Ωʔԡͬ͠ͺঢ়ଶͰֶߍ (1าา͘ͱܦݧ1Β͑ΔγεςϜ) ॳΊͯLv100ʹͨ͠ϙέϞϯ ΩϞϦ
(ਐԽ͠ͳ͔ͬͨ) 2ສऑ࣌ؒ༡Μͩ ΅͘ΒͷΞΠϥϯυ 2018/12/28͔ΒຖඞͣԿ͔͠Βͷߋ৽͕͋ͬͨήʔϜ 2021/4/30Ͱߋ৽ఀࢭɻ͔ͨ͠20191݄͘Β͍͔Βࢀઓ
࡞ΔʹࢸͬͨܦҢ λʔϛφϧ͕͖ (өըͰݟΔϋοΧʔΈ͍ͨͳײ͡) λʔϛφϧͰήʔϜ͕͍ͨ͠ʂʂʂ ୳ͦ͏ʂϛχήʔϜతͳͷ৭ʑ͋ͬͯ ఢͯ͠Ϩϕϧ্͛ͨΓΞΠςϜूΊͨΓͯ͠ΓࠐΊΔήʔϜ͕ͳ͍ ࡞Ζ͏ʂʂʂ (ͪΌΜͱௐͨΒ͍͢͝લ͔Β͋ͬͨΈ͍ͨ... ࣗͰ࡞Δ͜ͱʹมΘΓͳ͍͚Ͳ...) λʔϛφϧʹੈքΛ࡞Δɺͯ͜ͱήʔϜ໊
Termworld ͩʂ // TODO: ໊લͪΌΜͱߟ͑Δ
Ͳ͏͍͏ήʔϜʹ͢Δ͔ CLI͕͋ͬͯλʔϛφϧ্ͰͰ͖Δ ࣗҰਓͰෳΩϟϥΫλʔΛૢ࡞Ͱ͖Δ ʔ ήʔϜͷNPC AIͬͯऑ͔ͬͨΒ͑ͳ͍͠ڧ͗ͯࣗ͢Ͱ ɹ ͬͯΔײͳ͍͠ΧελϚΠζͰ͖ͯ͋Μ·Γࢥ͏௨Γ͍͔ͳ͍ શ෦ࣗͰૢ࡞Ͱ͖ΔΑ͏ʹͯ͠͠·͑ʂ CLI͕͋ΕࣗͰϓϩάϥϜΜͰશʹࣗͰෳΩϟϥૢ࡞Ͱ͖Δ
Player1 Player2 Player3 Player4 ࢜ ຐ๏ ճ෮ ϐοέϧ Player5 ϐοέϧ
ͭ·Γ͜͏͍͏͜ͱ ϢʔβʔPC ϒϥβ ࢜.rb ૐཿ.js $ ruby ࢜.rb ࢜ૢ࡞த... $
node ૐཿ.rb ૐཿૢ࡞த... ήʔϜαʔόʔ ૢ࡞ ΞΧϯτσʔλ ϓϨΠϠʔσʔλ Ϟϯελʔσʔλ Ϛελʔσʔλ ϓϨΠϠʔૢ࡞ ότϧγεςϜ ΞΠςϜ༻ ϞϯελʔAI etc... API API CLI JavaScript
Termworld 0 Α͠࡞Δͧʂ ޠϧʔϯϑΝΫτϦʔͷΑ͏ʹۀܥίϯςϯπཉ͍͠ʂ ·ͣۀܥίϯςϯπͷΈͷίϚϯυΛ࡞ͬͯΈΑ͏ʂ λʔϛφϧ্Ͱ࡞Λҭͯͯग़ՙɺಘͨࢿۚࢿݯ Λผίϯςϯπ(ݥ,қ,ΞΠςϜ࡞ͱ͔ͱ͔) ͷࢿۚࢿݯͱͯ͠ѻ͑ΔΑ͏ʹ͠Α͏ʂ (ήʔϜͷϚΠΫϩαʔϏεԽͩʂ) rubyಘҙͩ͠gemͱͯ͠࡞ͬͯΈΔ
gem install ͚ͩͨ͠Β༡ͼ͍ͨ ݴޠɾϥΠϒϥϦ Ruby thor (for CLI) sqlite3 (ϑΝΠϧʹσʔλॻ͖ࠐΈ) $ tw-farm show field --id=1 ┏━━━┳━━━┳━━━┓ ┃ b ┃ v ┃ ┃ ┣━━━╋━━━╋━━━┫ ┃ f ┃ v ┃ f ┃ ┗━━━┻━━━┻━━━┛ Πϝʔδ
Termworld 0 termworld 0-Ⅰ https://github.com/kthatoto/tw-farm--old छΛങͬͯ छΛ২͑ͯ ঢ়ଶΛ֬ೝͯ͠ ҭͬͨΒऩ֭ʂʂ ϓϩηεىಈ
์ஔ... ࣋ͪ֬ೝ (छͱ͓ۚ) DockerͰ༡·͢
Termworld 0 termworld 0-Ⅱ https://github.com/kthatoto/tw-farm छͷҰཡ ാͷҰཡ ാͷৄࡉΛγΣϧܳͰ֬ೝʂ ֬ೝͰ͖Δ͚ͩʂʂʂ ാछʹݻ༗Λ࣋ͨͤͯ
छվྑ͕Ͱ͖ΔΑ͏ͳ ͷΛߏɺ։ൃஅ೦... DockerͰ༡·͢
Termworld 0 ࣄͯͨ͠ΒཪଆͰ࡞͕ҭͬͯΔͷϫΫϫΫ ίϚϯυͰૢ࡞Ͱ͖Δ͠ҰݟήʔϜͬͯΘ͔ΓͮΒ͍͔Β ࣄதʹऩ֭Ͱ͖ͪΌ͏ ޮԽ͢ΔͳΒγΣϧܳඞཁʹͳͬͯ͘Δֶָ͘͠͠Δ ͔͠͠ ͳΜ͔ҧ͏ɺͬͺRPGΈ͍ͨͳͷ͕͍͍ɺgem installͪ͠Ό͏͠ ݁ہ͜ͷۀܥίϯςϯπΛଞͱܨ͛Δ͜ͱͳ͘ɺ·ͯ͜͠Εࣗମ
࡞Γ͖Δ͜ͱΛͤͣ։ൃதࢭ
Termworld Ⅰ Α͠࡞Δͧʂʂͬͺ2DRPGΈ͍ͨͳͷ͕͍͍ʂ ͦΕʹͯ͠cursesͰͷඳըͨΒΊΜͲ͍͘͞ ৭ͷѻ͍Կ͔ͱෆศͩ͠ ruby༻λʔϛφϧඳըϥΠϒϥϦ͔Β࡞Ζ͏ʂ https://github.com/kthatoto/term_canvas ͬͺΓrubyͰͪΐͪΐ͍ͱ࡞ͬͪΌ͓͏ɺMMORPGͳγεςϜΛ࡞Γ͍͔ͨΒ αʔόʔ͕ඞཁʹͳΔͳɻͦͨ͠ΒΞΧϯτ࡞ΔͷʹϝʔϧΞυϨεೝূೖΕΑ͏ʂ ӬଓԽ͢ΔσʔλΛDBαʔόʔʹอଘͯ͠
شൃ͍͍ͯ͠σʔλΛΫϥΠΞϯτଆͰ sqlite3Ͱ࣋ͭ͜ͱʹ͠Α͏ɻ ϓϨΠϠʔΛૢ࡞͢ΔͷʹCLIಋೖ͠Α͏ $ termworld user:<name> move up ༻ݴޠɾϥΠϒϥϦ Ruby thor, sqlite3, Rails curses (λʔϛφϧඳը) Πϝʔδ
Termworld Ⅰ CLI: https://github.com/kthatoto/termworld-ruby Server: https://github.com/kthatoto/termworld-server-rails $ termworld login ϝʔϧΞυϨεೖྗ
$ termworld user create PlayerΛ࡞ $ termworld user:<name> wakeup PlayerΛىಈ $ termworld user:<name> terminal ήʔϜλʔϛφϧΠϯλʔϑΣʔεΛىಈ खؒͱίπ͕͍ΔͷͰ Docker͚ͩͰ༡ͳ͍Ͱ͢
Termworld Ⅰ σϞɹhttps://github.com/kthatoto/termworld-ruby/blob/master/README.md ɹɹɹ⬛ ૢ࡞தϓϨΠϠʔ ɹɹɹ⬛ ࠨը໘ͷCLIͰૢ࡞͍ͯ͠ΔϓϨΠϠʔ ɹɹɹ⬛ Ϟϯελʔ
Termworld Ⅰ ήʔϜͬΆ͘ͳͬͨʂผϓϩηε͔Βૢ࡞Ͱ͖Δͷ͔͍͍ͬ͜ʂʂ ͔͠͠ Ϋϥεઃܭ͕ͪ͝Όͪ͝ΌʹͳͬͯԿ͕Ͳ͜ʹ͋Δ͔Θ͔ΒΜ rubyͷΈͰɺήʔϜαʔόʔ,UI,λʔϛφϧViewΛѻ͏ͷ͠ΜͲ͗͢Δ gem installͪ͠Ό͏͠ɺͦͦήʔϜαʔόʔ͕ΫϥΠΞϯτଆʹ͋Δ ࣌ͰΦϯϥΠϯԽͰ͖ͳ͍͡ΌΜɺ։ൃதࢭ
Termworld Ⅱ Α͠࡞ΔͧʂʂʂͬͺΓgem install͡Όͳͯ͘όΠφϦ͍ͨ͠... CLIGoͰ࡞ͬͯΔʂͦͨ͠Β͔ͤͬͩ͘͠αʔόʔGoͰ࡞Γ͍ͨ ͣͬͱͩ͜ΘͬͯͨɺλʔϛφϧViewΛΊͯWeb Viewʹ͠Α͏ʂ Ϛελʔσʔλͱ͔࡞Βͳ͍ͱͳ ͍͍πʔϧͳ͍͔ͳ... ͳͦ͞͏
RPGπΫʔϧΈ͍ͨͳͷࣗͰ࡞Δ͔ʂ CLI͔ΒϓϨΠϠʔपลঢ়ଶ(εςʔλε,Ϛοϓ, ଞΩϟϥͷҐஔ,࣋ͪͳͲ)ΛશͯऔಘͰ͖Δ Α͏ʹ͢ΕλʔϛφϧViewΫϥΠΞϯτ ࡞ΕΔͣʂޙ͔Β࡞ΕΔ͜ͱ͕ॏཁ ༻ݴޠɾϥΠϒϥϦ Go cobra(CLI), viper(config file), gin gorilla/websocket Nuxt, Express MongoDB, Cypress, GitHub Actions $ termworld up Πϝʔδ $ termworld attack
Termworld Ⅱ CLI: https://github.com/kthatoto/termworld Server: https://github.com/kthatoto/termworld-server ϝʔϧΞυϨεೝূػೳ $ termworld login
ϝʔϧΞυϨεೖྗ ϩϯάϙʔϦϯάͯ͠ೝূ ͞ΕΔͷΛͭ Token͖URL͕ ϝʔϧͰಧ͘ GETϦΫΤετͰೝূޭΛ αʔόʔʹ௨ ϩϯάϙʔϦϯάͷϨεϙϯεͰ ೝূ͞Εͨ͜ͱΛऔಘ Login success! ϓϨΠϠʔ࡞/Ұཡ CLI $ termworld player create Player࡞ $ termworld player list PlayerҰཡ Player͕ىಈ͞Εͨ͜ͱΛ֬ೝ $ termworld g <name> start PlayerΛ໊લࢦఆͰىಈ ͦͷଞϓϨΠϠʔૢ࡞ (Ҡಈ/ΞΫγϣϯͳͲ) ͜ͷίϚϯυͰߦ͏
σʔλϕʔε Termworld Ⅱ ϢʔβʔPC αʔόʔ ૢ࡞ ΞΧϯτσʔλ ϓϨΠϠʔσʔλ Ϟϯελʔσʔλ Ϛελʔσʔλ
ϓϨΠϠʔૢ࡞ ότϧγεςϜ ΞΠςϜ༻ ϞϯελʔAI etc... WebSocket ΤϯυϙΠϯτ JavaScript ϒϥβGUI API ϫʔΧʔϓϩηε Ϣʔβʔೖྗ $ move up $ login CLI ࢜.rb $ ruby ࢜.rb HTTP௨৴ WebSocket௨৴ RPC௨৴ γεςϜίʔϧ ϚελʔσʔλϚωʔδϟʔ DBίωΫγϣϯ Ϛοϓσʔλ ΞΠςϜσʔλ Ϟϯελʔσʔλ https://github.com/kthatoto/tw-master-data-manager https://github.com/kthatoto/termworld https://github.com/kthatoto/termworld-server
์ஔήʔϜͱͯ͠༡Ϳ ʔ ϞϯελʔΛङΓ·͘ΔεΫϦϓτΛॻ͘ ઓಆಛԽύʔςΟʹରͯ͠ΒͤΔ ʔ ՙ͕͍ͬͺ͍ʹͳͬͨΒ֗ʹͬͯՙཧ͢ΔεΫϦϓτΛॻ͘ ඇઓಆܥՙ࣋ͪಛԽϓϨΠϠʔʹରͯ͠ΒͤΔ ʔ ϞϯελʔΛආ͚ͯΞΠςϜऩू͚ͩ͢ΔεΫϦϓτΛॻ͘ ඇઓಆܥΞΠςϜऩूޮಛԽϓϨΠϠʔʹରͯ͠ΒͤΔ
ʔ ҆શʹ֗ʑΛҠಈͯ͠ަқͯ͠ࢿۚΛՔ͙εΫϦϓτΛॻ͘ ඇઓಆܥճආ&ަқಛԽϓϨΠϠʔʹରͯ͠ΒͤΔ ʔ ͻͨ͢ΒࡶڕϞϯελʔΛ͠·͘ΓϨΞυϩοϓΛૂ͏εΫϦϓτΛॻ͘ ӡۃൣғ߈ܸಛԽϓϨΠϠʔʹରͯ͠ΒͤΔ ͳͲͳͲɻ͜͏͍͏ϓϨΠ͕Ͱ͖ΔήʔϜγεςϜΛࢦͯ͠·͢
Δ͜ͱ ʔ طଘήʔϜͰ༡ΜͰΈΔɻήʔϜγεςϜࢀߟʹ͠Α͏ ʔ ·ͣϚοϓσʔλ࡞Βͳ͍ͱɻRPGπΫʔϧࢀߟʹ͠Α͏ ʔ Ϛοϓͷࣗಈੜɻ͔ͳΓ͍Ϛοϓ࡞Γ͍ͨ ʔ ը૾ͷ৭ҧ͍σʔλࣗಈੜɻڧͦ͏ͳ৭ͷϞϯελʔͱ͔࡞Γ͍ͨ ʔ
ཧը໘࡞Γ͍ͨɻϓϨΠϠʔ͕Ͳ͏͍͏ಈ͖ͯ͠Δ͔Λਆࢹ͍ͨ͠ ʔ υΩϡϝϯτॻ͔ͳ͍ͱɻCLIͩ͠ ʔ ϑϩϯτWebΞϓϦέʔγϣϯɻ͜Εͳ͍ͱʹͳΒͳ͍
Vue Composition API with TypeScript ͍ͯͯ͠ ݟ׳Εͳ͍Type Errorʹૺ۰ͨ͠ ͜͜
Sample Counter using Vue Composition API
͜ͱͷൃ ϩδοΫڞ௨Խ͍ͨ͠ʂ custom hookʹΓग़ͦ͏ʂ ܕ͕ҧ͏͔ΒGenericsͩʂ reactiveʹGenericsܕͷϓϩύςΟΛηοτʂ Type Error...
TileList.vue
useResources.ts
🤔 Genericsܕͷ͚࣌ͩൃੜ ιʔείʔυݟʹߦ͜͏ ͳʹ͜Ε... ͳʹ͜Ε...
node_modules/@vue/composition-api/dist/index.d.ts ֘෦ൈਮ 1ͭͣͭՄೳͳݶΓҙ༁͠ͳ͕Βݟ͍͖ͯ·͢💪
reactive ͱ͍͏ؔ Ҿ obj: T , ܕҾ T ͕༩͑ΒΕΔ (ͦͯ͜͠ͷ
T object ͷαϒλΠϓͰ͋Δ) ͜ͷؔͷΓͷܕ UnwrapRef<T> function reactive
UnwrapRef ͱ͍͏ܕ ܕҾ T ͕༩͑ΒΕΔ ͜ͷܕ T ͕ Ref<V> (Vҙ)
ͷܗΛ͍ͯͨ͠Β UnwrapRefSimple<V> ͦ͏͡Όͳ͚Ε UnwrapRefSimple<T> ͱ͍͏ܕʹͳΔ (Ref ʹ͍ͭͯলུ) Conditional Types & infererence type UnwrapRef
Conditional Types case study toggleStringNumber ͱ͍͏ؔ stringܕΛnumberܕʹมɺͦΕҎ֎Λstringܕʹม͢Δؔ
Infererence case study getFirstValue ͱ͍͏ؔ Ҿ͕"Կ͔(V)"ͷྻͩͬͨΒྻͷதͷ࠷ॳͷ"Կ͔(V)"Λ ͦ͏͡Όͳ͚ΕҾ(:T)Λͦͷ··ฦؔ͢
UnwrapRefSimple ͱ͍͏ܕ ܕҾ T ͕༩͑ΒΕΔ T ͕ Function | CollectionTypes
| BaseTypes | Ref ͷαϒλΠϓͰ͋Ε ͦͷ·· T ͱ͍͏ܕʹͳΔ ͦ͏͡Όͳ͚Ε...(ଓ͘) type UnwrapRefSimple 1/3
T ͕ Array<any> ͷαϒλΠϓͰ͋Ε ͜ͷྻͷͦΕͧΕͷཁૉͷܕΛ T[K] ͱ͢Δͱ ͦΕͧΕͷཁૉ͕ UnwrapRefSimple<T[K]> ͱ͍͏ܕʹͳΔ
ͦ͏͡Όͳ͚Ε...(ଓ͘) type UnwrapRefSimple 2/3 ྫ) UnwrapRefSimple<[number, Resource]> = [UnwrapRefSimple<number>, UnwrapRefSimple<Resource>]
T ͕ object ͷαϒλΠϓͰ͋Ε UnwrappedObject<T> ͱ͍͏ܕʹͳΓ ͦ͏͡Όͳ͚Ε T ͱ͍͏ܕʹͳΔ type
UnwrapRefSimple 3/3
UnwrappedObject ͱ͍͏ܕ ܕҾ T ͕༩͑ΒΕΔ (T extends object Λຬͨ͢લఏͰ) T
ͷͦΕͧΕͷ key,value pairͷ͏ͪvalue(T[P])Λ UnwrapRef<T[P]> ʹมͨ͠ܕʹͳΔ type UnwrappedObject ྫ) UnwrappedObject<{ key1: number, key2: Resource }> = { key1: UnwrapRef<number>, key2: UnwrapRef<Resource> } ͋·Γॏཁ͡Όͳׂ͍ʹෳࡶͳͷͰ লུ͠·͢ (& ͷه๏ Intersection Typesͱ͍͏ػೳͰ͢)
Q1. ͳΜͰܕͷܭࢉ్͕த·ͰͳΜͩΖ͏ʁ🤔 Q2. ͳΜͰUnwrapRefSimpleͱUnwrapRef͕ ɹɹผʑͰ͋ΔΜͩΖ͏ʁ🤔
Q1. ͳΜͰܕͷܭࢉ్͕த·ͰͳΜͩΖ͏ʁ🤔 A. ͦΕҎ্ܾ·͍ͬͯͳͯ͘ܭࢉͰ͖ͳ͍͔Βɻ ͜͜Ͱ݅ذ࢝·Δ͚ͲResource͕ܾ·Β ͳ͍͔Β͜ΕҎ্ແཧ
A. ยํ͕Resourceɺยํ͕Array<Resource>͔ͩΒ Array<Resource>ͷํ Array<any> ͱ్ͯ͠த·ͰܭࢉͰ͖Δ͔Βɻ Q2. ͳΜͰUnwrapRefSimpleͱUnwrapRef͕ผʑͰ͋ΔΜͩΖ͏ʁ🤔 Array<Resource>ͬͯ͜ͱͰ Ref<V> ͷܗ
ͯ͠ͳ͍͔Βͬͪͩ͜ʂ reactive<{ resource: Array<Resource> }> UnwrapRef<Array<Resource>> =>
reactive<{ resources: Array<Resource> }> => UnwrapRef<{ resources: Array<Resource> }> =>
UnwrapRefSimple<{ resources: Array<Resource> }> => UnwrappedObject<{ resources: Array<Resource> }> => { resources: UnwrapRef<Array<Resource>> } => { resources: UnwrapRefSimple<Array<Resource>> } => { resources: Array<UnwrapRefSimple<Resource>> } ऴྃ UnwrapRefSimple<Resource> ͜͜ͷܭࢉ͕Ͱ͖ͳ͍ ͪΌΜͱܭࢉͯ͠ΈΔ
ͦͦ͡Ό͋Ͳ͏͢Δ͔ ࠓͷͱ͜Ζ as Λ͏͔͠ͳͦ͞͏... reactiveʹΑΓੜ͞ΕͨͷΛී௨ͷObjectͱͯ͠ѻ͏ͷ͕ࠓͷͱ͜Ζͷղܾࡦ😢