Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ローコードSaaSのUXを向上させるためのTypeScript
Search
taro
November 15, 2024
Programming
2
1.2k
ローコードSaaSのUXを向上させるためのTypeScript
TSKaigi Kansai 2024での登壇資料です。
スピーカーノート
https://zenn.dev/taroro28/scraps/83e2a3cd6ea2b4
taro
November 15, 2024
Tweet
Share
More Decks by taro
See All by taro
VitestのIn-Source Testingが便利
taro28
11
3.2k
ローコードサービスの進化のためのモノレポ移行
taro28
2
510
GraphQLをServer Componentsで使いたい
taro28
8
3.2k
Sequenceを理解する
taro28
1
300
propsのバケツリレー対策でGlobal_Stateを使うその前に
taro28
12
4.9k
状態ってなに?🙃
taro28
2
580
ReactのSuspenseを使った非同期処理のエラーハンドリング
taro28
9
7.3k
一口目から美味しいReactのスルメ本🦑
taro28
3
1.5k
T-falってすごい【社内LT】
taro28
1
350
Other Decks in Programming
See All in Programming
Python札幌 LT資料
t3tra
4
650
Rubyで鍛える仕組み化プロヂュース力
muryoimpl
0
140
tparseでgo testの出力を見やすくする
utgwkk
2
240
從冷知識到漏洞,你不懂的 Web,駭客懂 - Huli @ WebConf Taiwan 2025
aszx87410
2
2.7k
re:Invent 2025 のイケてるサービスを紹介する
maroon1st
0
130
Rediscover the Console - SymfonyCon Amsterdam 2025
chalasr
2
170
ゲームの物理 剛体編
fadis
0
350
tsgolintはいかにしてtypescript-goの非公開APIを呼び出しているのか
syumai
7
2.2k
これだけで丸わかり!LangChain v1.0 アップデートまとめ
os1ma
6
1.9k
AI時代を生き抜く 新卒エンジニアの生きる道
coconala_engineer
1
310
Giselleで作るAI QAアシスタント 〜 Pull Requestレビューに継続的QAを
codenote
0
230
SwiftUIで本格音ゲー実装してみた
hypebeans
0
420
Featured
See All Featured
Code Review Best Practice
trishagee
74
19k
Writing Fast Ruby
sferik
630
62k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
51k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
310
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
1.8k
Stop Working from a Prison Cell
hatefulcrawdad
273
21k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
1.3k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.3k
The Language of Interfaces
destraynor
162
25k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
390
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.5k
The Invisible Side of Design
smashingmag
302
51k
Transcript
ローコードSaaSのUXを向上させるためのTypeScript 2024-11-16 TSKaigi Kansai 2024 株式会社ベースマキナ ⼤⻄太郎(taro)
自己紹介 • ⼤⻄太郎 • taro( @taroro_tarotaro) • 株式会社ベースマキナのソフトウェアエンジニア • ローコードで管理画⾯を作れるサービスを作ってます
⾃⼰紹介
⾃⼰紹介 ベースマキナでのTSの活⽤事例の話をします!
UXを向上させるためのTypeScriptとは?
UXを向上させるための TypeScriptとは? • ベースマキナはローコードで管理画⾯を作成するサービス • ⼀部ユーザーがJavaScriptで設定を書く機能が存在する UXを向上させるためのTypeScriptとは?
UXを向上させるための TypeScriptとは? UXを向上させるためのTypeScriptとは? JavaScriptで加⼯
UXを向上させるためのTypeScriptとは? アクション:APIやSQLなどを呼び出す処理 JavaScriptでワークフローを作成できる機能
UXを向上させるための TypeScriptとは? コードの⼊⼒や設定を楽にする機能の例 • 値や関数の型がわかる • ⼊⼒補完が効く • 誤った関数の使い⽅を間違えてしまった時にバリデーションが効く •
エラーメッセージがわかりやすい →こういったUX改善のためにどのようにTSの機能やライブラリを使っているかの話 UXを向上させるためのTypeScriptとは?
セッションの流れ • JavaScriptのコードエディターをTypeScriptの機能で便利にする • JavaScriptの関数の引数の値が型通りかをバリデーションする • まとめ 各話題は、やりたいことに対してどうやって実現したかの流れで進みます。 ぜひやりたいことのところで、みなさんならどうするか考えてみてください! 僕らとは違う⽅法やもっとよくできる点などあれば懇親会などで教えてください!
セッションの流れ
JavaScriptのコードエディターを TypeScriptの機能で便利にする
JavaScriptのコードエディターを TypeScriptの機能で便利にする • どんなJavaScriptのコードを設定する機能なのか? • Monaco Editor • default exportされる関数の引数にフォームの状態から⽣成した型をつける
• 組み込み関数に型をつける • ユーザーが作成したデータを元に型をつける JavaScriptのコードエディターをTypeScriptの機能で便利にする
どんなJavaScriptのコードを設定する機能なのか?
どんなJavaScriptのコードを設定する機能なのか? JavaScriptアクション:JavaScriptでワークフローを作成できる機能 JavaScriptのコードエディターをTypeScriptの機能で便利にする ワークフローの処理
どんなJavaScriptのコードを設定する機能なのか? JavaScriptアクション:JavaScriptでワークフローを作成できる機能 JavaScriptのコードエディターをTypeScriptの機能で便利にする
JavaScriptのコードエディターをTypeScriptの機能で便利にする パラメーター: ワークフローの実⾏時のフォームの⼊⼒値 パラメーターはJavaScriptのコードと⼀緒に設定する
どんなJavaScriptのコードを設定する機能なのか? JavaScriptのコードエディターをTypeScriptの機能で便利にする 組み込み関数
Monaco Editor
Monaco Editor • Microsoftが開発している • ブラウザ上で動作するコードエディター JavaScriptのコードエディターをTypeScriptの機能で便利にする https://github.com/microsoft/monaco-editor
Monaco Editor Monaco Editorを使っているサービス • TS Playground • Google CloudのBigQueryのエディター
JavaScriptのコードエディターをTypeScriptの機能で便利にする
Monaco Editor 今回のセッションにおいては、VSCodeと同様に • カーソルのホバーで型情報が表⽰される • 型による補完が効く エディターを使⽤しているという理解でOK! JavaScriptのコードエディターをTypeScriptの機能で便利にする
default exportされる関数の引数に フォームの状態から⽣成した型をつける
default exportされる関数の引数にフォームの状態から生成した型をつける JavaScriptのコードエディターを TypeScriptの機能で便利にする 引数に型をつけたい
default exportされる関数の引数にフォームの状態から生成した型をつける JavaScriptのコードエディターを TypeScriptの機能で便利にする フォームの設定内容から型が決まる
default exportされる関数の引数にフォームの状態から生成した型をつける JavaScriptのコードエディターを TypeScriptの機能で便利にする 型にもageが追加される age(数値)を追加
JavaScriptのコードエディターを TypeScriptの機能で便利にする JavaScriptの関数にどうやって型をつけるか?
default exportされる関数の引数にフォームの状態から生成した型をつける JavaScriptのコードエディターを TypeScriptの機能で便利にする JSDocで型をつける
default exportされる関数の引数にフォームの状態から生成した型をつける JavaScriptのコードエディターを TypeScriptの機能で便利にする https://nextjs.org/docs/app/api-reference/next-config-js https://vite.dev/config
default exportされる関数の引数にフォームの状態から生成した型をつける JavaScriptのコードエディターを TypeScriptの機能で便利にする
default exportされる関数の引数にフォームの状態から生成した型をつける JavaScriptのコードエディターを TypeScriptの機能で便利にする importしたHandler型をつける
default exportされる関数の引数にフォームの状態から生成した型をつける JavaScriptのコードエディターを TypeScriptの機能で便利にする
default exportされる関数の引数にフォームの状態から生成した型をつける JavaScriptのコードエディターを TypeScriptの機能で便利にする
JavaScriptのコードエディターを TypeScriptの機能で便利にする https://microsoft.github.io/monaco-editor/typedoc/interfaces/languages.typescript.LanguageServiceDefaults.html#addExtraLib
default exportされる関数の引数にフォームの状態から生成した型をつける JavaScriptのコードエディターを TypeScriptの機能で便利にする
default exportされる関数の引数にフォームの状態から生成した型をつける JavaScriptのコードエディターを TypeScriptの機能で便利にする フォームの設定内容から型を⽣成する
default exportされる関数の引数にフォームの状態から生成した型をつける JavaScriptのコードエディターを TypeScriptの機能で便利にする 泥臭く⽂字列結合で型を⽣成
default exportされる関数の引数にフォームの状態から生成した型をつける JavaScriptのコードエディターを TypeScriptの機能で便利にする
JavaScriptのコードエディターを TypeScriptの機能で便利にする フォームの状態に応じた型が効くようになった!🎉
組み込み関数に型をつける
組み込み関数に型をつける JavaScriptのコードエディターを TypeScriptの機能で便利にする 組み込み関数
組み込み関数に型をつける JavaScriptのコードエディターを TypeScriptの機能で便利にする
組み込み関数に型をつける JavaScriptのコードエディターを TypeScriptの機能で便利にする
組み込み関数に型をつける JavaScriptのコードエディターを TypeScriptの機能で便利にする
ユーザーが作成したデータを元に型をつける
ユーザーが作成したデータを元に型をつける JavaScriptのコードエディターを TypeScriptの機能で便利にする ユーザー体験的に⾜りない点がある
ユーザーが作成したデータを元に型をつける JavaScriptのコードエディターを TypeScriptの機能で便利にする ユーザーが作成したアクションのデータに基づいて渡せる値に制限がある
ユーザーが作成したデータを元に型をつける JavaScriptのコードエディターを TypeScriptの機能で便利にする アクションのIDまたは識別⼦ • ID: ⾃動⽣成のユニーク値 • 識別⼦: 任意に設定できるユニーク値
ユーザーが作成したデータを元に型をつける JavaScriptのコードエディターを TypeScriptの機能で便利にする
ユーザーが作成したデータを元に型をつける JavaScriptのコードエディターを TypeScriptの機能で便利にする • ⼊⼒ミスを防げる • ID/識別⼦を確認する⼿間を減らす
ユーザーが作成したデータを元に型をつける JavaScriptのコードエディターを TypeScriptの機能で便利にする アクションのパラメーター • キー(string): パラメーターの名前 • 値(any): パラメーターの値
ユーザーが作成したデータを元に型をつける JavaScriptのコードエディターを TypeScriptの機能で便利にする executeActionで呼び出している アクション(create-user)の パラメータの設定
ユーザーが作成したデータを元に型をつける JavaScriptのコードエディターを TypeScriptの機能で便利にする
ユーザーが作成したデータを元に型をつける JavaScriptのコードエディターを TypeScriptの機能で便利にする 第1引数のID/識別⼦を⼊⼒すると、第2引数のパラメーターの型が推論される! • ⼊⼒ミスを防げる • アクションの設定を確認する⼿間を減らす
ユーザーが作成したデータを元に型をつける JavaScriptのコードエディターを TypeScriptの機能で便利にする
ユーザーが作成したデータを元に型をつける JavaScriptのコードエディターを TypeScriptの機能で便利にする
ユーザーが作成したデータを元に型をつける JavaScriptのコードエディターを TypeScriptの機能で便利にする
ユーザーが作成したデータを元に型をつける JavaScriptのコードエディターを TypeScriptの機能で便利にする
ユーザーが作成したデータを元に型をつける JavaScriptのコードエディターを TypeScriptの機能で便利にする
ユーザーが作成したデータを元に型をつける JavaScriptのコードエディターを TypeScriptの機能で便利にする データベースに保存されているデータから型を⽣成する • バックエンドとの通信: GraphQL • データ取得&状態管理ライブラリ: Apollo
Client
ユーザーが作成したデータを元に型をつける JavaScriptのコードエディターを TypeScriptの機能で便利にする
ユーザーが作成したデータを元に型をつける その他、型に影響するパラメータの設定 • ⼊⼒が必須でなければオプショナルにする • 必須でも初期値があればオプショナルにする • パラメータが存在しない場合は第2引数をneverにする JavaScriptのコードエディターを TypeScriptの機能で便利にする
JavaScriptのコードエディターを TypeScriptの機能で便利にする ユーザーが作成したデータに応じた型が効くようになった!🎉
エディターの話のまとめ
まとめ • JSDocの@typeでTypeScriptのようにJavaScriptに型をつけられる • ローコードサービスでは、フォームの状態やデータベースの値から動的に型を ⽣成し、型情報やエディターの補完でユーザー体験を向上させている JavaScriptのコードエディターを TypeScriptの機能で便利にする
JavaScriptの関数の引数の値が型通りかを バリデーションする
JavaScriptの関数の引数の値が型通りかをバリデーションする • 組み込み関数のバリデーションとは? • JavaScriptのコードと組み込み関数が実⾏される流れ • 組み込み関数の引数が型通りの値かどうかのバリデーション • 可変⻑引数のバリデーション •
省略可能な引数のバリデーション • エラーメッセージをわかりやすくする JavaScriptの関数の引数の値が型通りかをバリデーションする
組み込み関数のバリデーションとは?
JavaScriptの関数の引数の値が型通りかをバリデーションする JavaScriptの関数の引数の値が型通りかをバリデーションする エディター上で型がついていてもあくまで実⾏するのはJavaScript
JavaScriptの関数の引数の値が型通りかをバリデーションする JavaScriptの関数の引数の値が型通りかをバリデーションする stringの引数に数値を渡してしまっている
JavaScriptのコードと組み込み関数が実⾏される流れ
JavaScriptのコードと組み込み関数が実行される流れ JavaScriptの関数の引数の値が型通りかをバリデーションする Web Frontend Main Backend JSExecutor
JavaScriptのコードと組み込み関数が実行される流れ JavaScriptの関数の引数の値が型通りかをバリデーションする Web Frontend Main Backend JSExecutor 画⾯のフォームから ワークフローを実⾏
JavaScriptのコードと組み込み関数が実行される流れ JavaScriptの関数の引数の値が型通りかをバリデーションする Web Frontend Main Backend JSExecutor DBからJSコードを 取得して送信
JavaScriptのコードと組み込み関数が実行される流れ JavaScriptの関数の引数の値が型通りかをバリデーションする Web Frontend Main Backend JSExecutor モジュールなどの後に default exportされた関数を
実⾏
JavaScriptのコードと組み込み関数が実行される流れ JavaScriptの関数の引数の値が型通りかをバリデーションする Web Frontend Main Backend JSExecutor 実⾏結果を返す 結果を返す
JavaScriptの関数の引数の値が型通りかをバリデーションする 組み込み関数はTypeScriptで実装
組み込み関数の引数が型通りの値かどうかのバリデーション
組み込み関数の引数が型通りの値かどうかのバリデーション JavaScriptの関数の引数の値が型通りかをバリデーションする • 処理に⼊る前に、引数が型通りの値かどうかを検証したい • 組み込み関数は複数あり今後も増えるので共通のバリデーション機構にしたい • できるだけただのTypeScriptの関数と近い体験で実装できるようにしたい
組み込み関数の引数が型通りの値かどうかのバリデーション JavaScriptの関数の引数の値が型通りかをバリデーションする 組み込み関数 引数をバリデーションする zodのスキーマ
組み込み関数の引数が型通りの値かどうかのバリデーション JavaScriptの関数の引数の値が型通りかをバリデーションする https://zod.dev
組み込み関数の引数が型通りの値かどうかのバリデーション JavaScriptの関数の引数の値が型通りかをバリデーションする バリデーション後の値の型を推論できる
JavaScriptの関数の引数の値が型通りかをバリデーションする
JavaScriptの関数の引数の値が型通りかをバリデーションする
JavaScriptの関数の引数の値が型通りかをバリデーションする
JavaScriptの関数の引数の値が型通りかをバリデーションする
JavaScriptの関数の引数の値が型通りかをバリデーションする
JavaScriptの関数の引数の値が型通りかをバリデーションする stringの引数に数値を渡してしまっている
JavaScriptの関数の引数の値が型通りかをバリデーションする stringの引数に数値を渡してしまっている エラーメッセージは、 終盤にわかりやすくします!
可変⻑引数のバリデーション
可変長引数のバリデーション JavaScriptの関数の引数の値が型通りかをバリデーションする ※この組み込み関数はサンプルのため実在しません
JavaScriptの関数の引数の値が型通りかをバリデーションする
JavaScriptの関数の引数の値が型通りかをバリデーションする 可変長引数のバリデーション
JavaScriptの関数の引数の値が型通りかをバリデーションする
省略可能な引数のバリデーション
JavaScriptの関数の引数の値が型通りかをバリデーションする zodのスキーマで 省略可能な引数をどう表現するか?
JavaScriptの関数の引数の値が型通りかをバリデーションする 可変⻑引数にする…?
JavaScriptの関数の引数の値が型通りかをバリデーションする
省略可能な引数のバリデーション JavaScriptの関数の引数の値が型通りかをバリデーションする
JavaScriptの関数の引数の値が型通りかをバリデーションする 第3引数を省略
JavaScriptの関数の引数の値が型通りかをバリデーションする 複数のスキーマで 省略可能な引数を作れるようにした
省略可能な引数のバリデーション JavaScriptの関数の引数の値が型通りかをバリデーションする スキーマに対応した関数のユニオン型が推論される
JavaScriptの関数の引数の値が型通りかをバリデーションする
JavaScriptの関数の引数の値が型通りかをバリデーションする Mapped Typesで、スキーマの配列を関数のユニオン型に変換
JavaScriptの関数の引数の値が型通りかをバリデーションする
JavaScriptの関数の引数の値が型通りかをバリデーションする スキーマの配列のインデックス: そのスキーマの型を使った関数
JavaScriptの関数の引数の値が型通りかをバリデーションする スキーマの配列から、各スキーマを使った関数のユニオン型に変換できる
JavaScriptの関数の引数の値が型通りかをバリデーションする 引数の値と 同じ⻑さのスキーマを探す
JavaScriptの関数の引数の値が型通りかをバリデーションする 同じ⻑さのスキーマで バリデーション
JavaScriptの関数の引数の値が型通りかをバリデーションする 最⻑のスキーマで バリデーション
JavaScriptの関数の引数の値が型通りかをバリデーションする 省略可能な引数も 表現できるようになった!
JavaScriptの関数の引数の値が型通りかをバリデーションする
JavaScriptの関数の引数の値が型通りかをバリデーションする
JavaScriptの関数の引数の値が型通りかをバリデーションする 同じ⻑さの異なるスキーマにも対応
JavaScriptの関数の引数の値が型通りかをバリデーションする インターセクション型に変更が必要
エラーメッセージをわかりやすくする
JavaScriptの関数の引数の値が型通りかをバリデーションする stringの引数に数値を渡してしまっている
JavaScriptの関数の引数の値が型通りかをバリデーションする
エラーメッセージをわかりやすくする JavaScriptの関数の引数の値が型通りかをバリデーションする
エラーメッセージをわかりやすくする JavaScriptの関数の引数の値が型通りかをバリデーションする ただ全てのメソッドの全てエラータイプに設定するのは⾮現実的…
JavaScriptの関数の引数の値が型通りかをバリデーションする https://github.com/aiji42/zod-i18n
JavaScriptの関数の引数の値が型通りかをバリデーションする
JavaScriptの関数の引数の値が型通りかをバリデーションする
JavaScriptの関数の引数の値が型通りかをバリデーションする satisfiesは本当に便利…
JavaScriptの関数の引数の値が型通りかをバリデーションする pathでエラーの位置がわかる
JavaScriptの関数の引数の値が型通りかをバリデーションする 泥臭く⽂字列結合でエラーメッセージを⽣成
JavaScriptの関数の引数の値が型通りかをバリデーションする エラーメッセージがわかりやすくなった!🎉
バリデーションの話のまとめ
まとめ JavaScriptのコードエディターを TypeScriptの機能で便利にする • zodのtupleを使うとJSの関数の引数が型通りかをバリデーションできる • TypeScriptの柔軟な型の表現⼒と型推論のおかげで、通常のTSの関数を実装す るような体験で、バリデーションが適⽤された組み込み関数を実装できる
最後に
最後に 最後に • ベースマキナではエディターの補完やバリデーションで、ユーザー体験のため にTypeScriptを活⽤している • ユーザーにJSを書いてもらう機能をTSを活⽤して作るのは⾯⽩い • 最終的には泥臭い実装で型やエラーメッセージを⽣成している🔥 泥臭い部分も含めてローコードサービス特有のTSを使った開発はとても⾯⽩い!
(ベースマキナのブースもあるので、ぜひお越しください!)
ありがとうございました!