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
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
メソッドのジェネリクスでGoの夢は広がるか? / Kyoto.go #65
utgwkk
3
760
Webフレームワークの ベンチマークについて
yusukebe
0
170
Oxlintのカスタムルールの現況
syumai
6
1.1k
Developing with AI Agents — Codex, Claude Code & Cowork Practical Guide
x5gtrn
PRO
0
1.3k
Honoでのサプライチェーン侵害対策 〜 3つのライブラリに学ぶ
yusukebe
4
740
ユニットテストの先へ:テスト技法で要求・仕様を整理するJava開発実践 / Beyond_Unit_Testing_Practical_Java_Development_Techniques_for_Organizing_Requirements_and_Specifications
shimashima35
0
400
過去最大のMCPアップデート! 2026-07-28 RC版の謎に迫る
licux
6
310
3Dシーンの圧縮
fadis
1
770
生成AI時代にこそ効くGo | Why Go Works in the Age of Generative AI
mom0tomo
8
3.2k
Lessons from Spec-Driven Development
simas
PRO
0
190
並列実装の現場、2ヶ月間実務でAIを使い倒したAIもPCも私も限界が近い
ming_ayami
0
130
Spring Security 実践 ─ GraphQL APIで実務に役立つ 認証・認可 を学ぶ
wagyu
0
230
Featured
See All Featured
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
540
Faster Mobile Websites
deanohume
310
31k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
270
The Invisible Side of Design
smashingmag
302
52k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
A Modern Web Designer's Workflow
chriscoyier
698
190k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Raft: Consensus for Rubyists
vanstee
141
7.5k
Bash Introduction
62gerente
615
220k
RailsConf 2023
tenderlove
30
1.5k
For a Future-Friendly Web
brad_frost
183
10k
Building Flexible Design Systems
yeseniaperezcruz
330
40k
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ͱͯ͠ѻ͏ͷ͕ࠓͷͱ͜Ζͷղܾࡦ😢