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 の便利な型変形を なんとかして Scala.js で使う / Emula...
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
TATSUNO Yasuhiro
April 17, 2020
Programming
2.1k
2
Share
TypeScript の便利な型変形を なんとかして Scala.js で使う / Emulating TypeScript Utility Types in ScalaJS
https://opt.connpass.com/event/169724/
TATSUNO Yasuhiro
April 17, 2020
More Decks by TATSUNO Yasuhiro
See All by TATSUNO Yasuhiro
ゆくKotlin くるRust
exoego
1
260
Scala 3 で GLSL のための c-like-for を実装してみた
exoego
1
990
Bun に LCOV 出力を実装した
exoego
2
350
terraform-provider-aws にプルリクして マージされるまで
exoego
2
500
ライブラリをパブリッシュせずにすばやく試す
exoego
2
350
esbuild 最適化芸人
exoego
3
2.7k
いい感じに AWS を組み合わせたビルディングブロックでアプリ開発を支援する / TdTechTalk 2022 11
exoego
0
900
Empowering App Dev by Nicely-Crafted High-Level AWS Components
exoego
0
110
月間数十億リクエストのマイクロサービスを支える JVM+AWS フルサーバーレス開発事例 / Now and Future of Fully Serverless development at Chatwork
exoego
1
830
Other Decks in Programming
See All in Programming
의존성 주입과 모듈화
fornewid
0
130
煩雑なSkills管理をSoC(関心の分離)により解決する――関心を分離し、プロンプトを部品として育てるためのOSSを作った話 / Solving Complex Skills Management Through SoC (Separation of Concerns)
nrslib
4
850
Don't Prompt Harder, Structure Better
kitasuke
0
670
夢の無限スパゲッティ製造機 -実装篇- #phpstudy
o0h
PRO
0
200
存在論的プログラミング: 時間と存在を記述する
koriym
5
860
VueエンジニアがReactを触って感じた_設計の違い
koukimiura
0
170
「効かない!」依存性注入(DI)を活用したAPI Platformのエラーハンドリング奮闘記
mkmk884
0
320
LM Linkで(非力な!)ノートPCでローカルLLM
seosoft
0
450
Codex CLIのSubagentsによる並列API実装 / Parallel API Implementation with Codex CLI Subagents
takatty
2
880
「話せることがない」を乗り越える 〜日常業務から登壇テーマをつくる思考法〜
shoheimitani
4
690
Redox OS でのネームスペース管理と chroot の実現
isanethen
0
570
CursorとClaudeCodeとCodexとOpenCodeを実際に比較してみた
terisuke
1
390
Featured
See All Featured
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.5k
Unsuck your backbone
ammeep
672
58k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
330
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.3k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
680
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
110
Into the Great Unknown - MozCon
thekraken
40
2.3k
Color Theory Basics | Prateek | Gurzu
gurzu
0
290
エンジニアに許された特別な時間の終わり
watany
106
240k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.7k
Transcript
TypeScript の便利な型変形を なんとかして Scala.js で使う Tatsuno | exoego | 2020-04-16
| #typefesta
自己紹介 長野県から参加してます Scala.js で GUI や AWS Lambda を 書いて暮らしてます
exoego exoego
今日言いたいこと3つ TypeScript には「型から型を作る関数」みたいな型、 Mapped Type があります Scala(.js) ではマクロで型を生成したり加工できます Mapped Type
を Scala マクロでエミュレーションし てみたが微妙なので、Scala 強い人たすけて!
JS (JavaScript) が使われる場所多い Web やスマホアプリ、そのサーバー Web ブラウザの拡張 Google Apps Script、Office
Scripts PC アプリ(electron)
でも JS はあまり書きたくない 動的型付け言語なので、 • 数値渡すところに文字列渡しちゃったり • Object 型のキー名を TYPO
しちゃったり 動かしてもなかなか気づけなくて時間を浪費
そこで静的型付け Alt-JS (JS 代替言語) Haskell Elm OCaml Reason F# Fable
Scala Scala.js 使い慣れた言語、ツールセットで、 JS をターゲットに開発できます 元言語: Alt-JS:
型システムなど Scala 言語機能が使える • パターンマッチ • for内包表記 • 既存の型に安全にメソッドを追加 •
継承関係がなくても型が満たすべき制約を書ける(型クラス) • マクロでコードを自動生成(型プロバイダーなど) Scala ライブラリがけっこう使える Scala 対応 IDE/エディタで快適に開発 Scala.js ⇔ JS 相互呼出できる Scala.js の特徴
JS コードを型安全に呼ぶには 開発では様々な外部の JS コードを使う • ランタイムの API: Web ブラウザ、Node.js…
• フレームワーク: React、Vue、Angular … • 開発キット: Google Apps Script、Kintone、AWS… 幸い、Alt-JS 言語には、こうした外部の JS に型定義 をつけて、型安全に呼び出せる仕組みが結構ある
型定義の例 (Scala.js)
こんな型定義を メンテするのは大変 そこで…
本日も何度か出てきた、静的型付け Alt-JS 巨大なコミュニティが多数の JS ライブラリに TS 用 型定義を整備している 最近では、ライブラリ本体が型定義を提供したり、 本体が
TS で開発される事例も増えてきている
巨人(TypeScript)の肩に乗れ TypeScript 用型定義を別の言語に変換するツールを 使えば、複雑な型定義を書く手間を大きく削減 !!!! Scala.js https://scalablytyped.org https://www.exoego.net/scala-js-ts-importer Fable https://github.com/fable-compiler/ts2fable
Reason https://github.com/cristianoc/genType
ブラウザで試せます。★付けたり issue いただけると嬉しい https://www.exoego.net/scala-js-ts-importer
しかし そう簡単には いかなかった!!
TypeScript の 型システムはヤバい…
https://www.typescriptlang.org/docs/handbook/utility-types.html “ TypeScript は、よくある 型変形 (type transformation) を手助けするいくつかの 便利な型を提供します ”
TypeScript の型システムでは 型を別の型に変形(型から別な型を作成) する関数のような型を定義できます。 このように作られた型を TypeScript では Mapped Type と呼ぶようです。
(TS詳しくないので間違ってたら教えてください)
1. Partial<T> T のプロパティを省略可能にする title を省略 使用箇所 以降のコード片は typescriptlang.org より引用
2. Readonly<T> T のプロパティを読取専用にする 再代入をエラーに 使用箇所
3. Pick<T, K> T から プロパティ K だけ残した型を作る 使用箇所 title
と completed は 元の Todo から引き継いでる リテラル型(プロパティ名) のユニオン型
4. Exclude<T, U> U に代入可能なプロパティを T から除いた型を作る
5. keyof T keyof オペレータは、T のプロパティの集合を返す これまでの型変形のいくつかは keyof を活用。このように作られ た型が
Mapped type
これで React のこ~んな型が 完全に理解できますね…!?
さきほど Alt-JS の型定義変換ツールを紹介しましたが 型変形/Mapped Type って 他言語の型システムに どう対応させればいいの?
Scala.js で やってみよう
戦略 Scala 2 には型変形 / Mapped Type 相当はないが… マクロで AST
を変形して型にプロパティを追加し たり、新しい型を生成したりできる !! Scala マクロ作る勉強のネタにやってみよう !!
アノテーション マクロ コンパイル後
アノテーション マクロ コンパイル後 除外
やってみた感想 マクロおもしろいけど、Mapped Type の完全再現は ムリそうな気がしてます… https://github.com/exoego/scalajs-util-types で開発 してるので、使ってみたい人、改良してみたい方は おチカラを…!!! Scala
言語機能にも Mapped Type っぽいの欲しい !!! JS 関係なく便利そうです
今日言いたいこと3つ TypeScript には「型から型を作る関数」みたいな型、 Mapped Type があります Scala(.js) ではマクロで型を生成したり加工できます Mapped Type
を Scala マクロでエミュレーションし てみたが微妙なので、Scala 強い人たすけて!
Scala.js は 覚悟があればいいぞ