lynx-typescript について
Lynx 開発者向けの TypeScript リファレンススキルです。環境設定、型拡張、イベント、ReactLynx API を扱い、設定例と一般的な型エラーへの対処法を示します。
主な機能
- 01Rspeedy と JSX の設定
- 02Lynx 型の拡張
- 03型付きイベント処理
- 04LynxUI と ref の型
- 05一般的な TypeScript エラーのガイド
活用シーン
- 01ReactLynx の TypeScript 設定
- 02カスタムネイティブコンポーネントの型付け
- 03Lynx 型宣言の不足への対処
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ lynx-community/ skills --skill lynx-typescriptインストール後、Claude Code で/lynx-typescriptを入力して読み込まれたか確認します。
詳細
TypeScript @ Lynx
このスキルでは、Lynx 開発における一般的な TypeScript の問題とその解決策をまとめています。主に環境設定、型の拡張、イベント処理、コンポーネント、ReactLynx の高度な使い方を扱います。
1. 設定 (環境設定)
1.1 tsconfig.json の設定
Rspeedy はデフォルトでルートディレクトリの tsconfig.json を読み込みます。Rspeedy はトランスパイルに SWC を使用するため、ファイル間の型参照エラーを避けるために isolatedModules オプションを有効にすることを推奨します。
{
"compilerOptions": {
"isolatedModules": true,
"paths": {
"@/*": ["./src/*"]
}
}
}
1.2 型パッケージのインストール
正しい型パッケージがインストールされていることを確認してください。@lynx-js/types は Lynx のコア型パッケージです。
- ReactLynx:
@lynx-js/typesと@lynx-js/reactをインストールします。
1.3 型宣言ファイル rspeedy-env.d.ts
TypeScript に Rspeedy の組み込み機能 (CSS Modules、静的リソースのインポートなど) を認識させるには、プロジェクトに src/rspeedy-env.d.ts ファイルを作成する必要があります:
/// <reference types="@rspeedy/core/client" />
(注: 実際のパッケージは Rspeedy のセットアップによって異なる場合があります。通常、オープンソースでは @rspeedy/core または同様のものです)
1.4 ReactLynx の JSX 設定
ReactLynx プロジェクトでは、JSX が正しくコンパイルされ型サポートを受けられるように、tsconfig.json で jsxImportSource を @lynx-js/react に設定する必要があります。
{
"compilerOptions": {
"jsx": "react-jsx",
"jsxImportSource": "@lynx-js/react"
}
}
2. Lynx の型の拡張
Lynx はデフォルトの型定義を提供していますが、ビジネス要件に合わせてこれらを拡張する必要が通常あります。
2.1 GlobalProps
lynx.__globalProps の型を拡張します:
declare module '@lynx-js/types' {
interface GlobalProps {
appTheme: string;
title: string;
// Add other custom global properties
}
}
export {};
これにより、lynx.__globalProps.appTheme を使用する際に型ヒントが表示されます。
2.2 InitData
ReactLynx フック useInitData() の戻り値の型を拡張します:
declare module '@lynx-js/react' {
interface InitData {
userInfo: {
name: string;
id: number;
};
// Add other initialization data properties
}
}
export {};
これにより、useInitData().userInfo を使用する際に型ヒントが表示されます。
2.3 IntrinsicElements (カスタムネイティブコンポーネント)
カスタムネイティブコンポーネントを使用する場合、JSX の型チェックを受けるために IntrinsicElements を拡張する必要があります:
import type * as Lynx from '@lynx-js/types';
import type { CSSProperties } from '@lynx-js/types';
declare module '@lynx-js/types' {
interface IntrinsicElements extends Lynx.IntrinsicElements {
'custom-input': {
'bindcustom-event'?: (e: { type: 'custom-event'; detail: { value: string } }) => void;
value?: string;
class?: string;
className?: string;
style?: string | CSSProperties;
};
}
}
2.4 NativeModules
カスタム Native Module の呼び出しをサポートするために、NativeModules 型を拡張します:
declare module '@lynx-js/types' {
interface NativeModules {
NativeLocalStorageModule: {
getStorageItem(key: string): string | null;
setStorageItem(key: string, value: string): void;
};
}
}
export {};
2.5 Lynx グローバルオブジェクト
lynx グローバルオブジェクトの型を拡張します (例: カスタムメソッド lynx.myMethod の追加):
declare module '@lynx-js/types' {
interface Lynx {
myMethod(param: string): void;
customProperty: number;
}
}
export {};
これにより、lynx.myMethod('test') を使用する際に型ヒントが表示されます。
3. イベント処理
イベントを処理する際は、any 型の使用を避けるべきです。Lynx は標準のイベント型を提供しています。
3.1 基本イベントとタッチイベント
タッチイベント (bindtap、bindtouchstart など) では、イベントオブジェクトに detail、touches、changedTouches などのプロパティが含まれます。
// Example: Handling a tap event
const handleTap = (event: any) => { // Using any is not recommended
console.log(event);
};
// Recommended approach: Define event interfaces or use inferred types
import type { TouchEvent } from '@lynx-js/types';
// Usage example
const handleButtonTap = (e: TouchEvent) => {
const { dataset } = e.currentTarget;
console.log('Tapped!', dataset);
};
4. ReactLynx と LynxUI の型
4.1 LynxUI コンポーネントの型
LynxUI コンポーネントは通常、その Props と Ref の型定義をエクスポートします。@lynx-js/lynx-ui (またはそのサブパッケージである @lynx-js/lynx-ui-button、@lynx-js/lynx-ui-scroll-view など) のコンポーネントを使用する場合は、これらのエクスポートされた型を使用する必要があります。
ベストプラクティス:
- Props 型と Ref 型を明示的にインポートします。
useRefを使用する際に Ref 型を指定します。
import { ScrollView } from '@lynx-js/lynx-ui-scroll-view';
import type { ScrollViewRef, ScrollViewProps } from '@lynx-js/lynx-ui-scroll-view';
import { useRef } from '@lynx-js/react';
function App() {
// Explicitly specify the Ref type
const scrollViewRef = useRef<ScrollViewRef>(null);
const handleScroll: ScrollViewProps['onScroll'] = (e) => {
console.log('Scrolled:', e.detail);
};
return (
<ScrollView
ref={scrollViewRef}
onScroll={handleScroll}
// ...
/>
);
}
4.2 MainThreadRef とマルチスレッド API
ReactLynx はメインスレッドの状態を処理するための専用 API を提供しています。
import { useMainThreadRef, runOnMainThread } from '@lynx-js/react';
function AnimationComponent() {
// Define the data type stored in MainThreadRef
const widthRef = useMainThreadRef<number>(0);
const handleTap = () => {
// Call main thread logic from the background thread
runOnMainThread(widthRef, (ref) => {
// This callback executes on the main thread
ref.current += 10;
console.log('New width:', ref.current);
});
};
return <view bindtap={handleTap} />;
}
4.3 Lynx グローバルオブジェクト
lynx グローバルオブジェクトは querySelector などのメソッドを提供しています。
// Select element
const element = lynx.querySelector('#my-id');
// The type of element is Element | null
// Register data processors (functional)
lynx.registerDataProcessors({
defaultDataProcessor: (data) => {
return data;
}
});
5. よくあるエラーの修正ガイド
-
エラー: プロパティ '...' は型 'GlobalProps' に存在しません -> 型の拡張については、2.1 GlobalProps を参照してください。
-
エラー: プロパティ '...' は型 'InitData' に存在しません -> 型の拡張については、2.2 InitData を参照してください。
-
エラー: プロパティ '...' は型 'JSX.IntrinsicElements' に存在しません -> 型の拡張については、2.3 IntrinsicElements (カスタムネイティブコンポーネント) を参照してください。 -> 競合する型パッケージがインストールされていないかも確認してください。
-
エラー: プロパティ 'cancelAnimationFrame' は型 'UnsafeLynx' に存在しません または CSSProperties を割り当てることができません -> 原因: 通常、競合する複数の Lynx 型パッケージをインストールしたことが原因です。 -> 解決策:
package.jsonを確認し、不要な型パッケージを削除して、@lynx-js/typesと@lynx-js/reactのみが残るようにしてください。 -
エラー: モジュール '...' またはそれに対応する型宣言が見つかりません ->
pathsが設定されているか (1.1 を参照)、またはd.tsの定義が不足していないかを確認してください。 -
エラー: 'lynx' が定義されていません -> プロジェクトに参照
import {} from "@lynx-js/react"が含まれていることを確認してください。 -
d.tsファイルでdeclare module '@lynx-js/types'を使用する場合は、グローバル汚染を避けるために空のオブジェクトexport {}を必ずエクスポートしてください。