К основному содержанию
скилл CX Codex

lynx-typescript — скилл для Claude Code: что делает и как установить

Скилл помогает настроить TypeScript в проектах на Lynx и ReactLynx, подсказывает типизацию событий, глобальных свойств и нативных компонентов.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add lynx-community/skills --skill lynx-typescript -a claude-code
Открыть на GitHub

Что делает lynx-typescript

Скилл даёт готовые инструкции по настройке окружения для разработки на Lynx. Он объясняет, как сконфигурировать tsconfig.json под сборщик Rspeedy на базе SWC: включить параметр isolatedModules, задать jsxImportSource: "@lynx-js/react" и подключить типы сборщика через src/rspeedy-env.d.ts со ссылкой на @rspeedy/core/client.

Внутри собраны шаблоны расширения модулей через declare module. Агент помогает типизировать глобальные параметры lynx.__globalProps, возвращаемое значение хука useInitData(), вызовы NativeModules и кастомные теги в IntrinsicElements. Также скилл показывает, как отказаться от any в пользу TouchEvent и как использовать многопоточные вызовы через useMainThreadRef и runOnMainThread.

Без пакета @lynx-js/types типизация Lynx работать не будет, поэтому проект требует его обязательной установки.

Какие задачи решает

  • настроить tsconfig.json для сборщика Rspeedy и ReactLynx
  • добавить типы для кастомных нативных компонентов в IntrinsicElements
  • типизировать глобальные свойства в lynx.__globalProps
  • исправить ошибки типизации событий касания без использования any

Примеры запросов агенту

  • Настрой tsconfig.json для проекта на ReactLynx и Rspeedy
  • Как расширить lynx.__globalProps своими типами в TypeScript?
  • Помоги типизировать событие bindtap через TouchEvent из @lynx-js/types

Как установить lynx-typescript

1Через Skills CLI (Vercel)

npx skills add lynx-community/skills --skill lynx-typescript -a claude-code

2Вручную: положить файлы

~/.claude/skills/lynx-typescript/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/lynx-typescript/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Вопросы о lynx-typescript

Как установить lynx-typescript в Claude Code?

Выполните команду npx skills add lynx-community/skills --skill lynx-typescript -a claude-code в терминале. Файл сохранится по пути ~/.claude/skills/lynx-typescript/SKILL.md.

Что делает скилл lynx-typescript?

Он содержит правила и примеры решения проблем с TypeScript в Lynx: настройку сборки через Rspeedy, расширение типов GlobalProps и InitData, а также работу с типами компонентов LynxUI.

Какие базовые пакеты нужны для работы типов в ReactLynx?

Для работы типов в ReactLynx требуются установленные пакеты @lynx-js/types и @lynx-js/react.

Исходный текст

SKILL.md · Apache-2.0
---
name: lynx-typescript
description: |
  This Skill summarizes common TypeScript issues and their solutions in Lynx development, mainly covering environment configuration, type extending, event handling, components, and ReactLynx advanced usages.

  Trigger Scenarios:
  - User inputs TypeScript error messages related to Lynx and seeks fix suggestions
  - LSP diagnoses Lynx-related TypeScript errors, proactively invoke query to get fix solutions
  - User asks about TypeScript best practices or common errors related to Lynx, proactively invoke query to provide guidance
  - User requests to configure the TypeScript environment of the current project to support Lynx development, proactively invoke query to provide configuration steps
---

# TypeScript @ Lynx

This Skill summarizes common TypeScript issues and their solutions in Lynx development, mainly covering environment configuration, type extending, event handling, components, and ReactLynx advanced usages.

## 1. Configuration (Environment Configuration)

### 1.1 `tsconfig.json` Configuration

Rspeedy reads the `tsconfig.json` in the root directory by default. Since Rspeedy uses SWC for transpilation, it is recommended to enable the `isolatedModules` option to avoid cross-file type reference errors.

```json title="tsconfig.json"
{
  "compilerOptions": {
    "isolatedModules": true,
    "paths": {
      "@/*": ["./src/*"]
    }
  }
}
```

### 1.2 Type Packages Installation

Ensure the correct type packages are installed. **@lynx-js/types** is the core type package for Lynx.

- **ReactLynx**: Install `@lynx-js/types` and `@lynx-js/react`.

### 1.3 Type Declaration File `rspeedy-env.d.ts`

To allow TypeScript to recognize Rspeedy's built-in features (such as CSS Modules, static resource imports), you need to create a `src/rspeedy-env.d.ts` file in the project:

```typescript title="src/rspeedy-env.d.ts"
/// <reference types="@rspeedy/core/client" />
```

*(Note: The actual package might depend on your Rspeedy setup, typically `@rspeedy/core` or similar for open source)*

### 1.4 ReactLynx JSX Configuration

For ReactLynx projects, you need to configure `jsxImportSource` as `@lynx-js/react` in `tsconfig.json` to ensure JSX is compiled correctly and gets type support.

```json title="tsconfig.json"
{
  "compilerOptions": {
    "jsx": "react-jsx",
    "jsxImportSource": "@lynx-js/react"
  }
}
```

## 2. Extending Lynx Types

Lynx provides default type definitions, but you usually need to extend them to suit business needs.

### 2.1 GlobalProps

Extend the type of `lynx.__globalProps`:

```typescript title="src/global-props.d.ts"
declare module '@lynx-js/types' {
  interface GlobalProps {
    appTheme: string;
    title: string;
    // Add other custom global properties
  }
}
export {};
```
This way, there will be type hints when using `lynx.__globalProps.appTheme`.

### 2.2 InitData

Extend the return value type of the ReactLynx Hook `useInitData()`:

```typescript title="src/init-data.d.ts"
declare module '@lynx-js/react' {
  interface InitData {
    userInfo: {
      name: string;
      id: number;
    };
    // Add other initialization data properties
  }
}
export {};
```
This way, there will be type hints when using `useInitData().userInfo`.

### 2.3 IntrinsicElements (Custom Native Components)

If custom native components are used, you need to extend `IntrinsicElements` to get JSX type checking:

```typescript title="src/intrinsic-element.d.ts"
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

Extend the `NativeModules` type to support custom Native Module calls:

```typescript title="src/native-modules.d.ts"
declare module '@lynx-js/types' {
  interface NativeModules {
    NativeLocalStorageModule: {
      getStorageItem(key: string): string | null;
      setStorageItem(key: string, value: string): void;
    };
  }
}
export {};
```

### 2.5 Lynx Global Object

Extend the type of the `lynx` global object (e.g., adding a custom method `lynx.myMethod`):

```typescript title="src/lynx-global.d.ts"
declare module '@lynx-js/types' {
  interface Lynx {
    myMethod(param: string): void;
    customProperty: number;
  }
}
export {};
```
This way, there will be type hints when using `lynx.myMethod('test')`.

## 3. Event Handling

When handling events, you should avoid using the `any` type. Lynx provides standard event types.

### 3.1 Basic Events and Touch Events

For touch events (like `bindtap`, `bindtouchstart`), the event object contains properties like `detail`, `touches`, `changedTouches`.

```typescript
// 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 Types

### 4.1 LynxUI Component Types

LynxUI components usually export the type definitions for their Props and Ref. When using components from `@lynx-js/lynx-ui` (or its sub-packages like `@lynx-js/lynx-ui-button`, `@lynx-js/lynx-ui-scroll-view`, etc.), you should use these exported types.

**Best Practices:**
1. Explicitly import Props and Ref types.
2. Specify the Ref type when using `useRef`.

```typescript
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 and Multi-threading APIs

ReactLynx provides dedicated APIs for handling main thread state.

```typescript
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 Global Object

The `lynx` global object provides methods like `querySelector`.

```typescript
// 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. Common Error Fix Guide

- **Error: Property '...' does not exist on type 'GlobalProps'**
  -> Refer to [2.1 GlobalProps](#21-globalprops) for type extension.

- **Error: Property '...' does not exist on type 'InitData'**
  -> Refer to [2.2 InitData](#22-initdata) for type extension.

- **Error: Property '...' does not exist on type 'JSX.IntrinsicElements'**
  -> Refer to [2.3 IntrinsicElements (Custom Native Components)](#23-intrinsicelements-custom-native-components) for type extension.
  -> Also check if conflicting type packages are installed.

- **Error: Property 'cancelAnimationFrame' does not exist on type 'UnsafeLynx'** or **CSSProperties not assignable**
  -> **Cause**: Usually caused by installing multiple conflicting Lynx type packages.
  -> **Solution**: Check `package.json`, remove unnecessary type packages, ensuring only `@lynx-js/types` along with `@lynx-js/react` are kept.

- **Error: Cannot find module '...' or its corresponding type declarations**
  -> Check if `paths` is configured (refer to [1.1](#11-tsconfigjson-configuration)) or if `d.ts` definitions are missing.

- **Error: 'lynx' is not defined**
  -> Ensure the project contains the reference `import {} from "@lynx-js/react"`.

- When using `declare module '@lynx-js/types'` in a `d.ts` file, make sure to export an empty object `export {}` to avoid global pollution.

© lynx-community · Apache-2.0 · lynx-community/skills

Похожие скиллы

Все скиллы по теме «Фронтенд и UI» →
expo-react-native-typescript Mindrally Скилл задаёт агенту правила разработки мобильных приложений на Expo, React Native и TypeScript: структура файлов, навигация, состояние, тесты. CX Codex +1 2 200установок appwrite-typescript appwrite Подсказывает агенту, как писать код на TypeScript SDK Appwrite: вход, база, файлы, realtime и серверные операции. CX Codex +1 2 100установок nextjs-react-typescript Mindrally Скилл задаёт стиль кода для Next.js App Router, React, TypeScript, Shadcn UI и Tailwind. Агент пишет функциональные компоненты, серверные по умолчанию, с TypeScript-интерфейсами. CX Codex +1 5 200установок typescript-variables mkosir Применяет соглашения TypeScript для переменных: const assertions, замена enum на литеральные типы, union вместо флагов, различение null и undefined. CX Codex +1 3 800установок typescript-discriminated-unions mkosir Скилл учит ИИ-агента применять дискриминированные объединения в TypeScript для взаимоисключающих состояний и проверять исчерпывающий switch через ESLint. CX Codex +1 3 800установок typescript-review metabase Проверяет изменения в TypeScript и JavaScript по правилам Metabase. Пригодится для ревью pull request и diff с фронтенд-кодом. CX Codex +1 2 300установок

Из того же набора6

lynx-devtool Помогает отлаживать приложения Lynx на Android, iOS и Desktop через CLI agent-lynx. Пригодится для работы с сессиями DevTool, деревом ReactLynx и снапшотами. CX Codex +1 6 200установок rspeedy-bundle-size Скилл разбирает, из чего складывается вес .lynx.bundle в rspeedy/ReactLynx, и подсказывает, за какой рычаг тянуть первым. CX Codex +1 458установок reactlynx-best-practices Проверяет и переписывает код ReactLynx с учётом двухпоточной модели Lynx: границы потоков, жизненный цикл, обработчики событий, сплиттинг. CX Codex +1 450установок lynx-trace-analysis Скилл разбирает трейсы Lynx и находит причину тормозов: медленный старт, джанк при скролле, утечки памяти. Полезен, когда есть файл трейса, но непонятно, что в нём смотреть. CX Codex +1 362установок lynx-trace-record Инструкция для ИИ-агента по записи трейсов производительности в приложениях на Lynx через скрипт trace_record. Помогает снять метрики первого кадра и памяти. CX Codex +1 353установок

Спонсоры проекта

Компании, которые помогают держать аналитику открытой