РекомендуетсяReact NativeTypeScript

React Native: компоненты, типы и платформенный профиль

Опишите платформенный профиль приложения до добавления экранов: версии React Native/Expo, навигацию, JS/TS-проверку и границу native-кода. Компонент использует native primitives и явные props, а платформенные различия локализованы.

Опубликовано Проверено Изменено

Плохо

export function OrderScreen(props: any) {
  return <div onClick={() => window.location.href = '/pay'}>
    {props.title}
  </div>; // DOM API ошибочно считается частью iOS/Android runtime.
}

Хорошо

import { Pressable, Text } from 'react-native';
 
type OrderCardProps = {
  title: string;
  onSelect: () => void;
};
 
export function OrderCard({ title, onSelect }: OrderCardProps) {
  return (
    <Pressable accessibilityRole="button" onPress={onSelect}>
      <Text>{title}</Text>
    </Pressable>
  );
}

Почему это важно

React Native рендерит платформенные компоненты, а не DOM браузера. Сборщик может преобразовать TypeScript без проверки типов; успешный JS bundle не подтверждает корректность native-интеграции.

Когда применять

iOS/Android React Native; пример предполагает TypeScript-профиль. Зафиксируйте точные React/React Native, поддерживаемые OS, native build tools и, при использовании, Expo SDK/Router. Expo и собственные native-проекты допустимы; способ обновления native-файлов и конфигурации должен быть один и понятный.

Новые компоненты/экраны называются PascalCase, hooks — useCamelCase, обычные функции — camelCase по принятому JS/TS-профилю. JSX хранится в .tsx, не-JSX типизированный код — в .ts; JS допустим в существующем согласованном профиле. Не добавляйте any для скрытия несовместимого native API.

Небольшое различие оформляйте через Platform, значительное — файлами .ios/.android с одинаковым публичным интерфейсом. Сборка должна выбирать реализацию на каждой целевой платформе. Навигационные params описываются в выбранном роутере, а внешняя deep link проходит отдельную проверку.

Общий код не предполагает наличие window/document/localStorage. Обработчик Pressable не хранит секрет, а текст расположен в Text. Типы проверяются отдельным инструментом профиля, кроме преобразования Metro/Babel; реальный release build проверяет зависимости и permissions. UI-тест в JS не подтверждает обе native-платформы.

Кто что делает

Человек

Выбирает поддерживаемые платформы, навигацию и Expo/native workflow.

AI-агент

Проверяет props и обе реализации, отделяет typecheck от транспиляции и native build.

Как проверить у себя

Вход и действиеОжидаемый результатСвидетельство
Card получает title и onSelect на iOS/AndroidОтображается Text, нажатие вызывает callback один разComponent/device checks
Неверный prop или неподдерживаемый DOM APIОшибка найдена типовой проверкой/сборкойTypecheck и bundle
Разные .ios/.android реализацииОбе выбраны корректно и имеют один контрактСборка/тест двух платформ
Новый native-модуль или permissionИзменен и проверен native build, не только JS bundleRelease build и device smoke

Baseline проекта включает выбранные версии; этот документ не обещает совместимость произвольного SDK с последним React Native.

ПервоисточникиИстория изменений на GitHub

Дата проверки отражает содержательную сверку. Синхронизация сайта не обновляет её автоматически.