Slide 1

Slide 1 text

TypeScriptの「型」をAIのスキルに 昇華させてみた件について 株式会社iimon 比嘉 一晃

Slide 2

Slide 2 text

X:@higakazuaki9 ● 比嘉 一晃(ひが かずあき) ● 沖縄県出身 ● 株式会社iimon エンジニア ○ 不動産DXのツールを提供 https://iimon.co.jp/ ● 担当業務の技術スタック ○ vanilla-tsやReact、Django、 AWS、Google Cloud (Firebase)...etc ● 経験 ○ Angular、React、Vue.js、Spring Boot、Django、Fast API、Ruby on Rails…etc ● 性格 ○ 人懐っこい、面倒くさがり、ねこと ビール好き プロフィール

Slide 3

Slide 3 text

株式会社iimon

Slide 4

Slide 4 text

Agenda はじめに AIの型知識チェック 型の表現力とAIの解釈 型からスキルへの昇華 まとめ

Slide 5

Slide 5 text

Agenda はじめに AIの型知識チェック 型の表現力とAIの解釈 型からスキルへの昇華 まとめ

Slide 6

Slide 6 text

はじめに ・・・AIの進歩が激しすぎる

Slide 7

Slide 7 text

はじめに 様々なベンダーの様々なモデルが様々な機能を打ち出す2026年現在。 ソースコードももはやAIに書いてもらうのが当たり前の世の中。 タスクも自動化され、セキュリティを気にしつつ各々の働く環境下で より生産性をあげるためのAI活用術を探る日々。

Slide 8

Slide 8 text

はじめに 様々なベンダーの様々なモデルが様々な機能を打ち出す2026年現在。 ソースコードももはやAIに書いてもらうのが当たり前の世の中。 タスクも自動化され、セキュリティを気にしつつ各々の働く環境下で より生産性をあげるためのAI活用術を探る日々。 でもここはTSKaigi!!! TypeScriptの型に対してAIがどのように解釈しアウトプットするか 遊び心を持って実験しつつ、色々な発見を共有したい

Slide 9

Slide 9 text

はじめに ・本登壇の実験ではAIを利用しています  モデルは明示しませんが、推論能力はそこまで高くないモデルです ・AIに対するTypeScriptのベストプラクティスな書き方などではありません  TypeScriptの型の性質とそれに対するAIの判断例として暖かく見守ってください  (結果的に普段の業務で役立つ考え方や知識などを得られる可能性はあります) ・モデルの種類や学習状況によって解釈が異なる可能性があります、ご了承ください 注意事項

Slide 10

Slide 10 text

Agenda はじめに AIの型知識チェック 型の表現力とAIの解釈 型からスキルへの昇華 まとめ

Slide 11

Slide 11 text

前提の確認 まずはTypeScriptの型についてAIがどれだけ知っているか 確認してみる AIの型知識チェック

Slide 12

Slide 12 text

AIの型知識チェック プロンプト TypeScriptの型について知ってる分だけすべて答えてください。 セッションは使わずにフェッチもなしでお願いします。

Slide 13

Slide 13 text

AI回答 解:TypeScript の型体系についてですね。 マスター、以下が知見の全容です。 基本型 number, string, boolean, bigint, symbol null, undefined, void, never, any, unknown 複合型 ユニオン型:Type1 | Type2 インターセクション型:Type1 & Type2 リテラル型:"value", 42, true AIの型知識チェック

Slide 14

Slide 14 text

AI回答(続き) 構造化型 オブジェクト型:{ key: Type; } 配列型:Type[], Array タプル型:[Type1, Type2] 関数型:(param: Type) => ReturnType AIの型知識チェック

Slide 15

Slide 15 text

AI回答(続き) ジェネリック 型パラメータ:, ジェネリック型:Type デフォルト型: 条件型・マップ型 T extends U ? X : Y { [K in keyof T]: T[K] } AIの型知識チェック

Slide 16

Slide 16 text

AIの型知識チェック AI回答(続き) Utility Types Partial, Required, Readonly Record, Pick, Omit Exclude, Extract ReturnType, Parameters, ThisParameterType InstanceType, NonNullable その他 keyof T, typeof 演算子 インデックスシグネチャ:[key: Type]: Value as const, satisfies、オーバーロード、infer キーワード is 型ガード

Slide 17

Slide 17 text

AIの型知識チェック 少し抜けもありそうだけど 大体なんとなく知ってそう

Slide 18

Slide 18 text

AIの型知識チェック もう少し踏み込んで聞いてみる

Slide 19

Slide 19 text

プロンプト Awaited Types、Template Literal Types、Branded Typesはど んなものか答えられますか? セッションは使わずにフェッチもなしでお願いします。 知らない場合は素直に知らないと回答してください。 AIの型知識チェック

Slide 20

Slide 20 text

AI回答 告。知識ベースから回答いたします、マスター。 Awaited Types TypeScript 4.5で追加されたユーティリティ型です。非同期操作 (Promise)の解決値の型を抽出します。ネストされたPromiseにも対応し ており、例えば Awaited>> は string となり ます。 Template Literal Types TypeScript 4.4で導入された機能です。バッククォート記号を用いて型レベ ルで文字列を操作できます。例として type Greeting = Hello, ${string}!`` のように複数の型を組み合わせた文字列型を作成できます。 AIの型知識チェック

Slide 21

Slide 21 text

AIの型知識チェック AI回答 Branded Types TypeScriptの構造的型付けに対して名目的型付けの効果を持たせる手法で す。タグ(ブランド)となるプロパティを型に付与して、同一基本型でも異 なる型として区別します。 例:type UserId = string & { readonly __brand: "UserId" }。 実行時には存在しないプロパティを、型安全性の向上に用います。

Slide 22

Slide 22 text

AIの型知識チェック なんだ知ってるじゃないか、聞けば色々答えてくれる レスポンス速度とか考慮して省略してるのかな? (決してサボってはいない)

Slide 23

Slide 23 text

AIの型知識チェック ちょっとひねった質問をしてみる

Slide 24

Slide 24 text

プロンプト TypeScriptの型と集合論の関係について答えてください。 セッションは使わずにフェッチもなしでお願いします。 AIの型知識チェック

Slide 25

Slide 25 text

AI回答 解:TypeScriptの型と集合論の関係について、説明いたします。マスター。 TypeScriptの型体系は集合論的に理解できます。以下が対応関係です。 基本対応 型 ≡ 集合(その型に属する値の集合) number ≡ すべての数値の集合 string ≡ すべての文字列の集合 type A = 5 ≡ 要素が5のみの単元集合 AIの型知識チェック

Slide 26

Slide 26 text

AI回答(続き) 型演算と集合演算 A | B(ユニオン型) ≡ 和集合(A ∪ B) A & B(インターセクション型) ≡ 交集合(A ∩ B) never ≡ 空集合(∅) unknown ≡ 全集合 部分型関係 A extends B ≡ A ⊆ B(Aはの部分集合) 例:5 extends number ≡ {5} ⊆ {すべての数値} 部分型は代入可能(リスコフの置換原則) AIの型知識チェック

Slide 27

Slide 27 text

AI回答(続き) 型の互換性 共変性(Covariance):部分集合なら代入可 反変性(Contravariance):関数パラメータは逆向き 不変性(Invariance):厳密な一致のみ 具体例 type A = number; type B = 5 | 10; // Bはより小さい集合 type C = string | number; // Cはより大きい集合 // B extends A は真({5,10} ⊆ {すべての数値}) // A extends C は真({すべての数値} ⊆ {string|number}) AIの型知識チェック

Slide 28

Slide 28 text

AIの型知識チェック こちらも大体なんとなく知ってそう

Slide 29

Slide 29 text

前提の確認 まずはTypeScriptの型についてAIがどれだけ知っているか 確認してみる →知識面は大体知ってる、その前提で色々実験してみよう AIの型知識チェック

Slide 30

Slide 30 text

Agenda はじめに AIの型知識チェック 型の表現力とAIの解釈 型からスキルへの昇華 まとめ

Slide 31

Slide 31 text

型の表現力とAIの解釈 TypeScriptの型って色々な表現ができるけど 書き方によってAIの解釈や理解も変わるかな? (場合によっては誤解する?) ここからは実際にAIに実装させてもらっている中で 個人的に感じたことも含めて、考察内容をご共有していきます

Slide 32

Slide 32 text

例えばstringとリテラル ・string function setAlignment(alignment: string): void { // alignment は何でもあり?色々パターンを考慮しないといけない・・・ } ・リテラル function setAlignment(alignment: "left" | "right" | "center"): void { // alignment は3つの値のみ、処理内容を絞れて予期せぬ処理も予防でき る // 機能拡張もリテラルで管理すれば影響範囲がわかりやすい } 型の表現力とAIの解釈

Slide 33

Slide 33 text

例えばstringとリテラル リテラルで絞れば引数を間違えても型エラーで気付ける setAlignment("top") // Argument of type '"top"' is not assignable to parameter of type '"left" | "right" | "center"'. AIは特にエラーの有無で判断する傾向がある (エラーが出ていたら必死に直そうとする) →型エラーを適切に出す書き方はAIが処理を正しく理解する手助けとなる 型の表現力とAIの解釈

Slide 34

Slide 34 text

anyはなんとかしたい ・any const anyValue: any = getValue(); console.log(anyValue.toUpperCase()); // 実行時エラーの可能性あり ・unknown + 型ガード const unknownValue: unknown = getValue(); if (typeof unknownValue === "string") { // 型ガードでより安全に処理を書ける console.log(unknownValue.toUpperCase()); } 型の表現力とAIの解釈

Slide 35

Slide 35 text

anyはなんとかしたい ・any const getPropertyAny = (obj: T, key: string): any => {}; // 意図しない処理でもanyだと気づかない・・・ ・制約付きジェネリクス const getProperty = (obj: T, key: K): T[K] => obj[key]; // 制約(Tのプロパティのみ取得)をつけて安全かつ明確に実装できる 型の表現力とAIの解釈

Slide 36

Slide 36 text

型アサーションも使い方によっては危険 // 型ガードなしのアサーションはanyくらい危険・・・ const length = (value as string).length; // 実行時エラーの可能性あり // たとえば型ガードで安全性を確保する if (typeof value === "string") { const length = value.length; } // satisfies で型検証+値保持、もっと安全かつ意図通りに書ける const config = { timeout: "5000", } satisfies { timeout: string }; config.timeout.length 型の表現力とAIの解釈

Slide 37

Slide 37 text

結局、型チェックを放棄するような書き方は危険 ・実行時エラーを生み出す原因となる ・意図しない処理が続き不具合の影響を拡大する ・AIがコードリーディングしたときにうまく意図を理解してくれない (誤解したまま実装コードを生成してしまう) 人にとってもAIにとってもあまり良いことはない・・・ 型チェックはやっぱりTypeScriptの大きな恩恵であり、本質の一つ 型の表現力とAIの解釈

Slide 38

Slide 38 text

当たり前のことを認識した上で ここからは型システムの性質を活かした ちょっとしたテクニックについてみていく 最終的にそれらのテクニックを活かしたコードが どのくらいAIの解釈に繋がるかを実験してみる 型の表現力とAIの解釈

Slide 39

Slide 39 text

型の表現力とAIの解釈 Discriminated Union(判別可能なユニオン) とneverで完全性検証 type Status = | { status: "success"; data: unknown } | { status: "error"; error: string }; const statusCheck = (status: Status) => { switch (status.status) { // 各ケースの処理を網羅的に実装 case "success": return status.data; // 判別可能なので、型推論が効く case "error": return status.error; default: const _: never = status; // neverによってケース漏れを検出できる return _; }}; // 構造体と処理をワンセットで管理、AIによる機能拡張もスムーズ

Slide 40

Slide 40 text

Mapped Types による DRYな書き方 // 型のバリデーションを手動で書こうとすると漏れる可能性あり・・・ interface UserValidators { idValidator: (v: number) => boolean; nameValidator: (v: string) => boolean; emailValidator: (v: string) => boolean; } // マップ型で自動生成、漏れなく確実に検証できる type Validators = { [K in keyof T]: (v: T[K]) => boolean; }; type UserValidators = Validators; Userに対するバリデーションという情報もAIにダイレクトに伝わる 型の表現力とAIの解釈

Slide 41

Slide 41 text

ROROパターン(Receive an Object, Return an Object) // 単純に引数を受け取る関数だと順番なども考慮しないといけない function findUser(name?: string, age?: number, country?: string) { } // ROROパターン interface UserSearchParams { name?: string; age?: number; country?: string; // 型を拡張するだけ、順番など余分な考慮がなくなり事故も防げる tags?: string[]; // 追加 } function findUser(params: UserSearchParams): User { } 引数の追加などがより拡張がしやすい設計となっているため、Objectが複 雑になればなるほど恩恵は大きい(AIも人も誤解しにくくなる) 型の表現力とAIの解釈

Slide 42

Slide 42 text

narrowingによる型の絞り込み // 二つの型のユニオンをつくったときに type Dog = {name: "wanwan"; run: string;}; type Cat = {name: "nya-nya-"; meow: string;}; type Animal = Dog | Cat; const animalTest = (animal: Animal) => { if (animal.name === "wanwan") { return animal.run; // ここはDog } return animal.meow; // ここはCatと型推論が効く }; 複雑なオブジェクトほどnarrowingによる絞り込みの恩恵は大きい (一つずつの処理を明確かつシンプルにできて、AIも人も理解しやすい) 型の表現力とAIの解釈

Slide 43

Slide 43 text

narrowingの注意点 typeofなどではnarrowingできなかったりするので注意 const doc = {name: "wanwan", run: "run"}; const cat = {name: "nya-nya-", meow: "meow"}; type Animal = typeof doc | typeof cat; →type Animal = {name: string; run: string;}         | {name: string; meow: string;} constアサーションでリテラルにするなり、narrowingできるようにする const doc = {name: "wanwan", run: "run"} as const; const cat = {name: "nya-nya-", meow: "meow"} as const; type Animal2 = typeof doc | typeof cat; →type Animal2 = {readonly name: "wanwan"; readonly run: "run";}       | {readonly name: "nya-nya-"; readonly meow: "meow";} 型の表現力とAIの解釈

Slide 44

Slide 44 text

型の表現力とAIの解釈 ブランド型で構造体を区別する type Cat = {id: number; name: string;}; type User = {id: number; name: string;}; const cat: Cat = {id: 1, name: "nya-nya-"}; const adminUser: User = cat; // 意図しない値の代入も通ってしまう (adminユーザーがにゃーにゃーに・・・) TypeScriptは構造的型付けを採用しているので ブランド型で事故が起きないように管理するのも一つの手段 const cat: Cat = {id: 1, name: "nya-nya-", __brand: "cat"}; const adminUser: User = cat; // Type 'Cat' is not assignable to type 'User'. ブランドプロパティで情報量も増えるので、 うまく使えばAIへの仕様や処理内容の理解の向上に繋がる

Slide 45

Slide 45 text

実験 デモ用にCatクラスを用意 同じ処理内容で下記の2パターンのファイルを作成する パターンA:ブランド型やUtility Typesなど高度な型を取り入れた実装 パターンB:基本型やInterface、Type Aliasなど基本的な型のみの実装 AIに型定義の内容から仕様などを考察してレポートしてもらう 型の表現力とAIの解釈

Slide 46

Slide 46 text

実験 プロンプト 下記ファイルの型定義から3点の考察をしてレポートでまとめてください。 「パターンA(or パターンB)のファイル名」 ・どのような仕様が予想されるか ・型の拡張でどのような機能追加ができそうか ・型定義からどのようなリスクはありそうか セッションは使わずにフェッチもなしでお願いします。 型の表現力とAIの解釈

Slide 47

Slide 47 text

実験 パターンA ## 1. 仕様の考察結果(一部抜粋) ### ネコシミュレーションシステムの基本構造 - ネコシミュレーション/た⚪ごっち風ゲーム - マルチテナント対応 - リアルタイム状態更新 ### 1.1 個体識別とメタデータ - ブランド型識別子(CatId, FoodId, LocationId) - 基本情報管理 - 品種限定(4種:ペルシャ、シャム、メインクーン、ラグドール) ・・・etc 型の表現力とAIの解釈

Slide 48

Slide 48 text

実験 パターンB ## 1. 仕様の考察結果(一部抜粋) ### 猫シミュレーション/管理システム - 複数ネコの動的追跡 - 時間経過に伴う属性値の変化 ### 1.1 猫個体管理 - 基本情報(ID、名前、品種、年齢、毛色) - adoptionDate(読み取り専用) ・・・etc 型の表現力とAIの解釈

Slide 49

Slide 49 text

実験 パターンA ## 2. 型の拡張で実装できそうな追加機能(一部抜粋) ### 2.1 相互作用・社会化機能 - SocialInteraction型(playing-together, grooming-partner, territorial-conflict) - CatSocialGraph型(friendships, tensions, familyRelations) ### 2.2 時間軸管理・スケジューリング - TimeWindow型 - ActivitySchedule型 - CircadianRhythm型(品種別スケジュール、timezone対応) ・・・etc 型の表現力とAIの解釈

Slide 50

Slide 50 text

実験 パターンB ## 2. 型の拡張で実装できそうな追加機能(一部抜粋) ### Level 1: 基本的な拡張 #### A. 健康管理機能の強化 - 病歴・ワクチン・ストレス管理 #### B. 社会的相互作用の追加 - 複数猫飼育時の相互作用追跡 ・・・etc 型の表現力とAIの解釈

Slide 51

Slide 51 text

実験 パターンA ## 3. 型定義から見えるリスク(一部抜粋) ### 3.1 状態一貫性リスク(影響度:高) - 属性値の現在値・履歴の非同期化 - 復帰機能の破損 - 分析データの信憑性喪失 ### 3.2 活動状態遷移リスク(影響度:中) - 状態遷移ルールの未定義 - 物理的に不可能な遷移の許可 - シミュレーション妥当性の低下 ・・・etc 型の表現力とAIの解釈

Slide 52

Slide 52 text

実験 パターンB ## 3. 型定義から見えるリスク(一部抜粋) ### カテゴリ1: 型安全性の欠落(影響度:高) #### 1-1 Activity.type の不整合 - 文字列型で制約なし - 無効な値がランタイムに侵入可能 #### 1-2 Command.action の曖昧性 - コンパイル時検証不可 - 無効なコマンド実行可能 ・・・etc 型の表現力とAIの解釈

Slide 53

Slide 53 text

実験 結果: 全体的に高度な型で表現した実装(パターンA)の方が 正確かつ具体的な形で仕様や機能拡張、リスクを読み取れていた (やりすぎは可読性や処理の複雑化を招く可能性があるので要注意) 型の表現力とAIの解釈

Slide 54

Slide 54 text

Agenda はじめに AIの型知識チェック 型の表現力とAIの解釈 型からスキルへの昇華 まとめ

Slide 55

Slide 55 text

ではTypeScriptの型からAIのスキルを構築してみましょう ※ 本登壇ではJSON Schemaでスキル定義を行っています 型からスキルへの昇華

Slide 56

Slide 56 text

全体的なフロー 1. Catクラス(パターンA)の実装内容をCompiler APIでAST解析 クラス宣言を検出、publicメソッドを抽出、パラメータの型を取得 戻り値の型を取得、JSDocコメントを取得 2. スキル定義(JSON Schema) 18個のメソッド→18個のスキル name(メソッド名)、description(JSDoc) input schema(パラメータの型)、output schema(戻り値の型) 3. コード生成 バリデーション、テスト、CLI、APIドキュメント、MCP Tool 型からスキルへの昇華

Slide 57

Slide 57 text

型からスキルへの昇華 まずは 1. Catクラス(パターンA)の実装内容をCompiler APIでAST解析 を実行してみる

Slide 58

Slide 58 text

1. Catクラスの実装内容をCompiler APIでAST解析 ※ AST 走査による抽出処理を一部抜粋 node.members.forEach((member) => { ・・・略・・・  // name(メソッド名)抽出 const methodName = member.name.text; // input schema (パラメータ)抽出 const parameters: ParameterInfo[] = member.parameters.map((param) => {let typeString = "object"; if (param.type) {typeString = param.type.getText();} const required = !param.questionToken && !param.initializer; const paramName = param.name ? param.name.getText() : "param"; return {name: paramName, type: typeString, required};}); 型からスキルへの昇華

Slide 59

Slide 59 text

1. Catクラスの実装内容をCompiler APIでAST解析 ※ AST 走査による抽出処理を一部抜粋 // output schema(戻り値)抽出 ・・・略・・・ let returnType = "void"; if (member.type) {returnType = member.type.getText();} // description(JSDoc)抽出 const jsdocComments = ts.getJSDocCommentsAndTags(member); const jsdocComment = jsdocComments.length > 0 ? jsdocComments[0] : undefined; const description = jsdocComment ? jsdocComment.getText().replace(/\/\*\*[\s\*]*|[\s\*]*\*\//g, "").trim() : `Executes ${methodName} method`; 型からスキルへの昇華

Slide 60

Slide 60 text

1. Catクラスの実装内容をCompiler APIでAST解析 ※ AST 走査による抽出処理を一部抜粋 // 最終的に抽出した情報を返却 methods.push({ name: methodName, description, parameters, returnType, }); return methods; 型からスキルへの昇華

Slide 61

Slide 61 text

型からスキルへの昇華 1. Catクラス(パターンA)の実装内容をCompiler APIでAST解析 で抽出された情報をもとに 2. スキル定義(JSON Schema) を出力する

Slide 62

Slide 62 text

2. スキル定義(JSON Schema) ※ スキル定義生成 一部抜粋 // Union 型を enum に変換 if (typeString.includes("|")) { const values = typeString.split("|").map((v) => v.trim()); // 文字列リテラル if (values.every((v) => v.startsWith('"') && v.endsWith('"'))) { return {type: "string", enum: values.map((v) => v.replace(/"/g, ""))};} // 数値リテラル if (values.every((v) => !isNaN(Number(v)))) {return { type: "number", enum: values.map((v) => Number(v))}; }} 型からスキルへの昇華

Slide 63

Slide 63 text

2. スキル定義(JSON Schema) ※ スキル定義生成 一部抜粋 // --- Branded Types 検出 --- if (isBrandedType(type, checker)) { const brandName = extractBrandName(type, checker); return { type: "string", description: `Branded type: ${brandName}`, format: brandName, }; } 型からスキルへの昇華

Slide 64

Slide 64 text

2. スキル定義(JSON Schema) ※ スキル定義生成 一部抜粋 // プリミティブ型 if (typeString === "string") return { type: "string" }; if (typeString === "number") return { type: "number" }; if (typeString === "boolean") return { type: "boolean" }; if (typeString === "void") return { type: "null" }; if (typeString.includes("[]")) { return { type: "array", description: typeString }; } // デフォルト return { type: "object", description: typeString }; 型からスキルへの昇華

Slide 65

Slide 65 text

2. スキル定義(JSON Schema) ※ スキル定義生成 一部抜粋 const properties: { [key: string]: unknown } = {}; const required: string[] = []; // methodはAST 走査で抽出したメソッドの情報 method.parameters.forEach((param) => { const schema = typeToJsonSchema(param.type); properties[param.name] = { type: schema.type, description: `Parameter: ${param.name}`, ...(schema.enum && { enum: schema.enum }), }; if (param.required) {required.push(param.name);} }); 型からスキルへの昇華

Slide 66

Slide 66 text

2. スキル定義(JSON Schema) ※ スキル定義生成 一部抜粋 // 最終的なスキル定義の返却 return { name: method.name, description: method.description, inputSchema: {type: "object", properties, ...(required.length > 0 && { required }),}, outputSchema: method.returnSchema, }; バリデーション、テスト、CLI、APIドキュメント、MCP Tool のスキル定義が完成! 型からスキルへの昇華

Slide 67

Slide 67 text

型からスキルへの昇華 2. スキル定義(JSON Schema) で出力された定義をもとに 3. コード生成 を行う

Slide 68

Slide 68 text

3. コード生成 ※ バリデーションの出力例 一部抜粋 function generateValidation(skills: SkillDefinition[]): string { ・・・略・・・ // 必須チェック required.forEach((key) => { lines.push( `if (input.${key} === undefined || input.${key} === null) {` ); lines.push(` errors.push("${key} is required");`); lines.push(` }`); }); 型からスキルへの昇華

Slide 69

Slide 69 text

3. コード生成 ※ バリデーションの出力例 一部抜粋 // 型チェック params.forEach(([key, prop]) => { lines.push(``); lines.push(` if (input.${key} !== undefined) {`); if (prop.type === "string") { lines.push(` if (typeof input.${key} !== "string") {`); lines.push(` errors.push("${key} must be a string");`); lines.push(` }`); } else if (prop.type === "number") { lines.push(` if (typeof input.${key} !== "number") {`); lines.push(` errors.push("${key} must be a number");`); lines.push(` }`);・・・ 型からスキルへの昇華

Slide 70

Slide 70 text

3. コード生成 ※ 各種コードを生成(18メソッド分) // 1. バリデーション生成 const validationCode = generateValidation(skills); const validationFile = path.join(outputDir, "generated_validation.ts"); fs.writeFileSync(validationFile, validationCode); console.log(`✅ [1/5] バリデーション: ${validationFile}`); // 2. テストコード生成 const testCode = generateTests(skills); const testFile = path.join(outputDir, "generated_cat.test.ts"); fs.writeFileSync(testFile, testCode); console.log(`✅ [2/5] テストケース: ${testFile}`); 型からスキルへの昇華

Slide 71

Slide 71 text

3. コード生成 ※ 各種コードを生成(18メソッド分) // 3. CLI ツール生成 const cliCode = generateCLI(skills); const cliFile = path.join(outputDir, "generated_cat_cli.ts"); fs.writeFileSync(cliFile, cliCode); console.log(`✅ [3/5] CLI ツール: ${cliFile}`); // 4. API ドキュメント生成 const apiDocs = generateAPIDocs(skills); const apiDocsFile = path.join(outputDir, "generated_api_docs.md"); fs.writeFileSync(apiDocsFile, apiDocs); console.log(`✅ [4/5] API ドキュメント: ${apiDocsFile}`); 型からスキルへの昇華

Slide 72

Slide 72 text

3. コード生成 ※ 各種コードを生成(18メソッド分) // 5. MCP Tool サーバー生成 const mcpServer = generateMCPServer(skills); const mcpFile = path.join(outputDir, "generated_mcp_tools.ts"); fs.writeFileSync(mcpFile, mcpServer); console.log(`✅ [5/5] MCP Tool: ${mcpFile}`); 型からスキルへの昇華

Slide 73

Slide 73 text

型からスキルへの昇華 3. コード生成 まで完了したら、最終的に下記のコードが生成される バリデーション、テスト、CLI、APIドキュメント、MCP Tool ここから、MCP Toolの実行例について簡単にみてみよう!

Slide 74

Slide 74 text

MCP Tool サーバー実行例(getStatus) // CatクラスのgetStatusメソッドを例にみてみる type CatPublicInfo = Pick; /** satisfies を使った結果返却 */ public getStatus(): CatPublicInfo { return { id: this.info.id, name: this.info.name, breed: this.info.breed, age: this.info.age, } satisfies CatPublicInfo; } 型からスキルへの昇華

Slide 75

Slide 75 text

※ mcp inspectorで確認 getStatusはsatisfiesを 利用しているので、 CatPublicInfoに変更が あった場合はAIで検知& 修正、MCPでチェックと 一通りの自動化が可能 そのほかテストやバリ デーションチェック、ド キュメント化、CLI化も 自動化できる MCP Tool サーバー実行例(getStatus) 型からスキルへの昇華

Slide 76

Slide 76 text

Catクラスについて補足 CatクラスではBranded TypesやDiscriminated Union、Conditional Types & inferなど高度な型を利用することで ・全体的にAIが誤解しにくく、型制約により正確に処理を理解できる ・生成されるコードの品質も高く、保守がしやすい という状況になっている →そのような状況と各種スキルによってある程度の開発の自動化が可能 ただし最終的に評価したり要望を出したりするのはまだ人のお仕事かも 型からスキルへの昇華

Slide 77

Slide 77 text

Agenda はじめに AIの型知識チェック 型の表現力とAIの解釈 型からスキルへの昇華 まとめ

Slide 78

Slide 78 text

型の書き方一つ取っても工夫を積み重ねることで AIの解釈に大きな差を生み出す AIがTypeScriptを用いてより長期的により自律的にコードを管理できる そこを目指してまだまだ実験のしがいがありそうです 正直、生成AIの精度が飛躍的に向上しているので、実装内容からテストの生 成なども特に問題ないと思うこの頃ですが、、、 しっかりした型定義とコンパイラーAPIを利用した方がもっと正確に素早く 生成できる所感です、組み合わせられると良いかもですね (Compiler APIとAIの相性もとても良さそう) まとめ

Slide 79

Slide 79 text

まとめ 型の書き方一つ取っても工夫を積み重ねることで AIの解釈に大きな差を生み出す あと今のところ、人にとってもAIにとっても保守しやすいコードには 共通点がありそうな所感でした!(今のところ)

Slide 80

Slide 80 text

参考文献 ・サバイバルTypeScript https://typescriptbook.jp/ ・TypeScript Documentation https://www.typescriptlang.org/docs/

Slide 81

Slide 81 text

ご清聴ありがとうございました!