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
ローコードSaaSのUXを向上させるためのTypeScript
Search
taro
November 15, 2024
Programming
2
770
ローコード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
GraphQLをServer Componentsで使いたい
taro28
8
2.8k
Sequenceを理解する
taro28
1
220
propsのバケツリレー対策でGlobal_Stateを使うその前に
taro28
11
4.2k
状態ってなに?🙃
taro28
2
490
ReactのSuspenseを使った非同期処理のエラーハンドリング
taro28
9
6.6k
一口目から美味しいReactのスルメ本🦑
taro28
3
1.4k
T-falってすごい【社内LT】
taro28
1
270
Reactは何を提供するLibraryなのか?
taro28
7
1.5k
Other Decks in Programming
See All in Programming
競技プログラミングへのお誘い@阪大BOOSTセミナー
kotamanegi
0
350
17年周年のWebアプリケーションにTanStack Queryを導入する / Implementing TanStack Query in a 17th Anniversary Web Application
saitolume
0
250
たのしいparse.y
ydah
3
120
Haze - Real time background blurring
chrisbanes
1
510
【re:Growth 2024】 Aurora DSQL をちゃんと話します!
maroon1st
0
770
暇に任せてProxmoxコンソール 作ってみました
karugamo
1
720
StarlingMonkeyを触ってみた話 - 2024冬
syumai
3
270
Security_for_introducing_eBPF
kentatada
0
110
Cloudflare MCP ServerでClaude Desktop からWeb APIを構築
kutakutat
1
530
Итераторы в Go 1.23: зачем они нужны, как использовать, и насколько они быстрые?
lamodatech
0
700
Fibonacci Function Gallery - Part 1
philipschwarz
PRO
0
210
Recoilを剥がしている話
kirik
5
6.6k
Featured
See All Featured
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
191
16k
4 Signs Your Business is Dying
shpigford
181
21k
Building Adaptive Systems
keathley
38
2.3k
How STYLIGHT went responsive
nonsquared
95
5.2k
Testing 201, or: Great Expectations
jmmastey
40
7.1k
Thoughts on Productivity
jonyablonski
67
4.4k
The Language of Interfaces
destraynor
154
24k
Adopting Sorbet at Scale
ufuk
73
9.1k
Speed Design
sergeychernyshev
25
670
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.2k
Code Reviewing Like a Champion
maltzj
520
39k
Side Projects
sachag
452
42k
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を使った開発はとても⾯⽩い!
(ベースマキナのブースもあるので、ぜひお越しください!)
ありがとうございました!