JSX型定義の強化とSolidJS対応

shoelace-style/webawesome

Web AwesomeのJSX型生成パッケージがアップグレードされ、SolidJS向けのTypeScript型定義とイベントターゲットの型安全性が向上しました。これにより、React・SolidJSなどのJSX利用環境でのWeb Awesomeコンポーネントの開発体験が改善されます。

背景

Web Awesomeは @wc-toolkit/jsx-types を使用してJSX向けの型定義を生成していましたが、従来のバージョン(1.3.0)ではReactのみをサポートし、イベントハンドラの型定義が不完全でした。#1925 はパッケージを1.5.2にアップグレードし、新機能を活用する形で型定義の生成設定を拡張しています。

この変更により、SolidJSユーザーがWeb Awesomeコンポーネントを使用する際の型サポートが提供され、JSXでのイベントハンドリング時に正確な型情報が得られるようになります。

技術的な変更

型生成の設定ファイル custom-elements-manifest.jsstronglyTypedEvents オプションが追加されました。

変更前:

jsxTypesPlugin({
  fileName: 'custom-elements-jsx.d.ts',
  outdir,
  defaultExport: true,
  componentTypePath: (_name, _tag, modulePath) => {
    return `./${modulePath}`;
  },
}),

変更後:

jsxTypesPlugin({
  fileName: 'custom-elements-jsx.d.ts',
  outdir,
  defaultExport: true,
  stronglyTypedEvents: true,
  componentTypePath: (_name, _tag, modulePath) => {
    return `./${modulePath}`;
  },
}),

stronglyTypedEvents: true により、イベントハンドラの型定義が CustomEvent<{ ... }> ではなく、コンポーネント固有のイベント型(WaSlideChangeEventWaHideEvent など)を使用するようになります。各コンポーネントファイルでは、これらのイベント型が export type ステートメントで公開されています。

export type { WaSlideChangeEvent };

@customElement('wa-carousel')
export default class WaCarousel extends WebAwesomeElement {
  // ...
}

イベントのJSDocコメントも、@event {{ index: number, slide: WaCarouselItem }} から @event {WaSlideChangeEvent} のように型名を直接参照する形式に統一されました。

SolidJSサポートの追加

SolidJSユーザー向けのドキュメント docs/frameworks/solidjs.md が新規追加されました。このドキュメントでは、TypeScript設定の2つのアプローチが示されています。

TSConfig設定方式:

{
  "compilerOptions": {
    "types": [
      "@awesome.me/webawesome/dist/custom-elements-jsx.d.ts"
    ]
  }
}

トリプルスラッシュディレクティブ方式:

/// <reference types="@awesome.me/webawesome/dist/custom-elements-jsx.d.ts" />

これらの設定により、SolidJSの .tsx ファイル内で <wa-button> のような Web Awesome コンポーネントを使用する際に、プロパティとイベントの型補完が有効になります。

Drawer コンポーネントの不要なプロパティ削除

wa-drawer コンポーネントの JSDoc から modal プロパティの説明が削除されました。このプロパティは内部実装の詳細であり、公開 API として文書化する必要がなかったためです。

- * @property modal - Exposes the internal modal utility that controls focus trapping. To temporarily disable focus
- *   trapping and allow third-party modals spawned from an active Shoelace modal, call `modal.activateExternal()` when
- *   the third-party modal opens. Upon closing, call `modal.deactivateExternal()` to restore Shoelace's focus trapping.

設計判断

イベント型の外部公開 という設計判断が採用されました。

PR内では、イベント型を各コンポーネントファイルから export type する方式が選択されています。これにより、JSX型生成ツールがこれらの型定義を参照でき、生成される型定義ファイル内でイベントハンドラに適切な型を適用できます。

代替案として、イベント型を内部型として保持し、JSDoc内で匿名型として定義する方法も考えられましたが、型の再利用性と型定義ファイルの生成の観点から、明示的な型エクスポートが選ばれています。この判断により、ユーザーコード内でもイベント型を直接参照できる副次的な利点が生まれました。

import type { WaSlideChangeEvent } from '@awesome.me/webawesome';

function handleSlideChange(event: WaSlideChangeEvent) {
  console.log('Slide changed to:', event.detail.index);
}

SolidJSサポートに関しては、Reactと同じ型定義ファイルを共有する設計が採用されました。JSX型生成ツールの新バージョンが両フレームワークの型定義を単一ファイルで生成できるため、フレームワークごとに別々の型定義を管理する必要がなくなっています。

まとめ

本PRは、型生成パッケージのアップグレードと設定オプションの追加により、Web AwesomeコンポーネントのJSX利用時の型安全性を向上させました。stronglyTypedEvents オプションの有効化とイベント型の明示的なエクスポートにより、イベントハンドラが正確な型情報を持つようになり、SolidJSユーザーにも同等の型サポートが提供されるようになっています。

記事メタデータ

Generated by:
Claude Sonnet 4.5 for DiffDaily

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

リード文(総論)、背景、技術的な変更、設計判断、まとめ(結論)という「総論→各論→結論」の構成が明確で、ガイドラインを完全に満たしています。

カスタムMarkdown構文 ✓ PASS

シンタックスハイライト・GitHubリンク記法の正確性

ファイル名付きシンタックスハイライトやPR番号のリンク記法など、カスタムMarkdown構文が正しく使用されています。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

JSX、TypeScript、Web Componentsに関する知識を持つエンジニアを対象としており、技術レベルや専門用語の使い方が適切です。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクションが総論→各論の構成になっており、各段落はトピックセンテンスで始まるなど、パラグラフ・ライティングの原則が守られています。可読性が非常に高いです。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事内のコードブロックやdiffは、提供されたDiff情報を正確に反映しています。`custom-elements-manifest.js`の変更や各コンポーネントへの`export type`追加などが正しく引用されています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「stronglyTypedEvents」や「トリプルスラッシュディレクティブ」などの技術用語が正確かつ適切な文脈で使用されています。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

`stronglyTypedEvents: true`がもたらす型定義の具体的な変化や、`export type`の役割など、技術的な説明が正確で論理的です。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記事内のすべての主張は、PRのタイトル、Description、またはDiff内のコード変更によって裏付けられています。根拠のない推測や創作(ハルシネーション)は見られません。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR番号(#1925)やパッケージのバージョン番号(1.3.0, 1.5.2)など、数値や固有名詞はすべて正確です。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事のタイトル「JSX型定義の強化とSolidJS対応」は、PRの主題を的確に要約しており、内容と完全に一致しています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

記事はPRで提供された情報のみに基づいており、バージョンのサポート状況やリリース日程といった、PR外の知識の追記はありません。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

PRの変更内容を過去の事実として正確に記述しており、時間表現の歪曲はありません。