الفرق بين المراجعتين لصفحة: «ReactNative/typescript»

من موسوعة حسوب
لا ملخص تعديل
طلا ملخص تعديل
 
(مراجعتان متوسطتان بواسطة مستخدمين اثنين آخرين غير معروضتين)
سطر 1: سطر 1:
== استخدام لغة TypeScript ==
<noinclude>{{DISPLAYTITLE:استخدام لغة TypeScript مع React Native}}</noinclude>
تُعَد لغة [[TypeScript]] توسعةً للغة JavaScript من خلال إضافة تعريفات الأنواع مثل [https://flow.org/ Flow]. أُنشِأ إطار عمل React Native ضمن Flow، لكنه يدعم كلًا من TypeScript و Flow افتراضيًا.
تُعَد لغة [[TypeScript]] توسعةً للغة [[JavaScript]] من خلال إضافة تعريفات الأنواع مثل [https://flow.org/ Flow]. أُنشِأ إطار عمل React Native ضمن Flow، لكنه يدعم كلًا من TypeScript و Flow افتراضيًا.


=== كيفية البدء باستخدام لغة TypeScript ===
== كيفية البدء باستخدام لغة TypeScript ==
إذا بدأت مشروعًا جديدًا، فهناك عدة طرق مختلفة للبدء.
إذا بدأت مشروعًا جديدًا، فهناك عدة طرق مختلفة للبدء.


يمكنك استخدام [https://github.com/react-native-community/react-native-template-typescript قالب TypeScript] من خلال:<syntaxhighlight lang="bash">
يمكنك استخدام [https://github.com/react-native-community/react-native-template-typescript قالب TypeScript] من خلال:<syntaxhighlight lang="bash">
npx react-native init MyApp --template react-native-template-typescript
npx react-native init MyApp --template react-native-template-typescript
</syntaxhighlight><blockquote>'''ملاحظة:''' إن فشل الأمر السابق، فقد يكون لديك إصدار قديم من <code>react-native</code> أو <code>react-native-cli</code> مثبت عالميًا على نظامك. يمكن إصلاح المشكلة من خلال إلغاء تثبيت CLI:
</syntaxhighlight><blockquote>'''ملاحظة:''' إن فشل الأمر السابق، فقد يكون لديك إصدار قديم من <code>react-native</code> أو <code>react-native-cli</code> مثبت عالميًا على نظامك. يمكن إصلاح المشكلة من خلال إلغاء تثبيت CLI أي: <code>npm uninstall -g react-native-cli</code> أو <code>yarn global remove react-native-cli</code> ثم شغّل الأمر <code>npx</code> مرة أخرى.</blockquote>يمكنك استخدام [https://expo.io/ Expo] الذي يحتوي على قالبَي TypeScript من خلال:


* <code>npm uninstall -g react-native-cli</code> أو <code>yarn global remove react-native-cli</code>
* '''في npm:'''<syntaxhighlight lang="bash">
 
ثم شغّل الأمر <code>npx</code> مرة أخرى.</blockquote>يمكنك استخدام [https://expo.io/ Expo] الذي يحتوي على قالبَي TypeScript من خلال:
 
'''في npm:'''<syntaxhighlight lang="bash">
npm install -g expo-cli
npm install -g expo-cli
expo init MyTSProject
expo init MyTSProject
</syntaxhighlight>'''في yarn:'''<syntaxhighlight lang="bash">
</syntaxhighlight>
 
* '''في yarn:'''<syntaxhighlight lang="bash">
yarn global add expo-cli
yarn global add expo-cli
expo init MyTSProject
expo init MyTSProject
</syntaxhighlight>أو يمكنك استخدام [https://github.com/infinitered/ignite Ignite]، الذي يحتوي أيضًا على قالب TypeScript من خلال:
</syntaxhighlight>أو يمكنك استخدام [https://github.com/infinitered/ignite Ignite]، الذي يحتوي أيضًا على قالب TypeScript من خلال:


'''في npm:'''<syntaxhighlight lang="bash">
* '''في npm:'''<syntaxhighlight lang="bash">
npm install -g ignite-cli
npm install -g ignite-cli
ignite new MyTSProject
ignite new MyTSProject
</syntaxhighlight>'''في yarn:'''<syntaxhighlight lang="bash">
</syntaxhighlight>
 
* '''في yarn:'''<syntaxhighlight lang="bash">
yarn global add ignite-cli
yarn global add ignite-cli
ignite new MyTSProject
ignite new MyTSProject
</syntaxhighlight>
</syntaxhighlight>


=== إضافة TypeScript إلى مشروع قائم ===
== إضافة TypeScript إلى مشروع قائم ==
1. أضف TypeScript وأنواع React Native و Jest إلى مشروعك من خلال:
1. أضف TypeScript وأنواع React Native و Jest إلى مشروعك من خلال:


'''في npm:'''<syntaxhighlight lang="bash">
* '''في npm:'''<syntaxhighlight lang="bash">
npm install -D typescript @types/jest @types/react @types/react-native @types/react-test-renderer
npm install -D typescript @types/jest @types/react @types/react-native @types/react-test-renderer
</syntaxhighlight>'''في yarn:'''<syntaxhighlight lang="bash">
</syntaxhighlight>
 
* '''في yarn:'''<syntaxhighlight lang="bash">
yarn add -D typescript @types/jest @types/react @types/react-native @types/react-test-renderer
yarn add -D typescript @types/jest @types/react @types/react-native @types/react-test-renderer
</syntaxhighlight>2. أضف ملف إعداد config file خاص بلغة TypeScript، ثم أنشئ ملف <code>tsconfig.json</code> في جذر root مشروعك:<syntaxhighlight lang="typescript">
</syntaxhighlight>2. أضف ملف إعداد config file خاص بلغة TypeScript، ثم أنشئ ملف <code>tsconfig.json</code> في جذر root مشروعك:<syntaxhighlight lang="typescript">
سطر 62: سطر 64:
   moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node']
   moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node']
};
};
</syntaxhighlight>4. أعد تسمية ملف JavaScript ليصبح <code>tsx.*</code><blockquote>يجب عليك ترك ملف نقطة الدخول <code>index.js/.</code> كما هو، وإلّا فقد تواجه مشكلة عندما يتعلق الأمر بتجميع bundling إصدار الإنتاج production build.</blockquote>5. شغّل الأمر <code>yarn tsc</code> لكتابة التحقق من أنواع ملفات TypeScript الجديدة.
</syntaxhighlight>4. أعد تسمية ملف JavaScript ليصبح <code>*.tsx</code><blockquote>'''ملاحظة:''' يجب عليك ترك ملف نقطة الدخول <code>./index.js</code> كما هو، وإلّا فقد تواجه مشكلة عندما يتعلق الأمر بتجميع bundling إصدار الإنتاج production build.</blockquote>5. شغّل الأمر <code>yarn tsc</code> لكتابة التحقق من أنواع ملفات TypeScript الجديدة.


=== كيف تعمل TypeScript مع React Native ===
== كيف تعمل TypeScript مع React Native ==
يعمل تحويل ملفاتك إلى JavaScript باستخدام [[ReactNative/javascript environment|بنية Babel الأساسية]] نفسها لمشروع React Native بدون TypeScript. نوصي باستخدام مصرّف TypeScript للتحقق من الأنواع فقط. إذا كان لديك شيفرة TypeScript موجودة ومنقولة إلى React Native، فهناك [https://babeljs.io/docs/en/babel-plugin-transform-typescript تحذير أو اثنين] لاستخدام Babel بدلًا من TypeScript.
يعمل تحويل ملفاتك إلى JavaScript باستخدام [[ReactNative/javascript environment|بنية Babel الأساسية]] نفسها لمشروع React Native بدون TypeScript. نوصي باستخدام مصرّف TypeScript للتحقق من الأنواع فقط. إذا كان لديك شيفرة TypeScript موجودة ومنقولة إلى React Native، فهناك [https://babeljs.io/docs/en/babel-plugin-transform-typescript تحذير أو اثنين] لاستخدام Babel بدلًا من TypeScript.


=== كيف تبدو React Native مع TypeScript ===
== كيف تبدو React Native مع TypeScript ==
يمكنك توفير واجهة لخاصيات Props وحالة State مكوّن React من خلال <code><React.Component<Props, State</code> والتي ستوفر تحققًا من النوع ومحرّرًا بإكمالٍ آلي عند العمل مع هذا المكون في JSX.<syntaxhighlight lang="typescript">
 
يمكنك توفير واجهة لخاصيات Props وحالة State مكوّن React من خلال <code>React.Component<Props, State>‎</code> والتي ستوفر تحققًا من النوع ومحرّرًا بإكمالٍ آلي عند العمل مع هذا المكون في JSX.<syntaxhighlight lang="typescript">
import React from 'react';
import React from 'react';
import { Button, StyleSheet, Text, View } from 'react-native';
import { Button, StyleSheet, Text, View } from 'react-native';
سطر 135: سطر 138:
</syntaxhighlight>يمكنك استكشاف شكل الصياغة أكثر في [https://www.typescriptlang.org/play?strictNullChecks=false&jsx=3#code/JYWwDg9gTgLgBAJQKYEMDG8BmUIjgcilQ3wG4BYAKFEljgG8AhAVxhggDsAaOAZRgCeAGyS8AFkiQweAFSQAPaXABqwJAHcAvnGy4CRdDAC0HFDGAA3JGSpUFteILBI4ABRxgAznAC8DKnBwpiBIAFxwnjBQwBwA5hSUgQBGKJ5IAKIcMGLMnsCpIAAySFZCAPzhHMwgSUhQCZq2lGickXAAEkhCQhDhyIYAdABiAMIAPO4QXgB8vnAAFPRBKCE8KWmZ2bn5nkUlXXMADHCaAJS+s-QBcC0cbQDaSFk5eQXFpTxpMJsvO3ulAF05v0MANcqIYGYkPN1hlnts3vshKcEtdbm1OABJDhoIghLJzebnHyzL4-BG7d5deZPLavSlIuAAajgAEYUWjWvBOAARJC4pD4+B+IkXCJScn0-7U2m-RGlOCzY5lOCyinSoRwIxsuDhQ4cyicu7wWIS+RoIQrMzATgAWRQUAA1t4RVUQCMxA7PJVqrUoMTZm6PV7FXBlXAAIJQKAoATzIOeqDeFnsgYAKwgMXm+AAhPhzuF8DZDYk4EQYMwoBwFtdAmNVBoIoIRD56JFhEhPANbpCYnVNNNa4E4GM5Iomx3W+2RF3YkQpDFYgOh8OOl0evR8ARGqXV4F6MEkDu98P6KbvubLSBrXaHc6afCpVTkce92MAPRjmCD3fD+tqdQfxPOsWDYTgVz3cwYBbAAibEBVSFw1SlGCINXdA0E7PIkmAIRgEEQoUFqIQfBgmIBSFVDfxPTh3Cw1ssRxPFaVfYCbggHooFIpIhGYJAqLY98gOAsZQPYDg0OHKDYL5BC0lVR8-gEti4AwrDgBwvCCKIrpSIAE35ZismUtjaKITxPAYjhZKMmBWOAlpONIog9JMvchIgj8G0AocvIA4SDU0VFmi5CcZzmfgO3ESQYG7AwYGhK5Sx7FA+ygcIktXTARHkcJWS4IcUDw2IOExBKQG9OAYMwrI6hggrfzTXJzEwAQRk4BKsnCaraTq65NAawI5xixcMqHTAOt4YAAC8wjgAAmQ5BuHCasgAdSQYBYjEGBCySDi9PwZbAmvKBYhiPKADZloGqgzmC+xoHgAzMBQZghHgTpuggBIgA TypeScript playground].
</syntaxhighlight>يمكنك استكشاف شكل الصياغة أكثر في [https://www.typescriptlang.org/play?strictNullChecks=false&jsx=3#code/JYWwDg9gTgLgBAJQKYEMDG8BmUIjgcilQ3wG4BYAKFEljgG8AhAVxhggDsAaOAZRgCeAGyS8AFkiQweAFSQAPaXABqwJAHcAvnGy4CRdDAC0HFDGAA3JGSpUFteILBI4ABRxgAznAC8DKnBwpiBIAFxwnjBQwBwA5hSUgQBGKJ5IAKIcMGLMnsCpIAAySFZCAPzhHMwgSUhQCZq2lGickXAAEkhCQhDhyIYAdABiAMIAPO4QXgB8vnAAFPRBKCE8KWmZ2bn5nkUlXXMADHCaAJS+s-QBcC0cbQDaSFk5eQXFpTxpMJsvO3ulAF05v0MANcqIYGYkPN1hlnts3vshKcEtdbm1OABJDhoIghLJzebnHyzL4-BG7d5deZPLavSlIuAAajgAEYUWjWvBOAARJC4pD4+B+IkXCJScn0-7U2m-RGlOCzY5lOCyinSoRwIxsuDhQ4cyicu7wWIS+RoIQrMzATgAWRQUAA1t4RVUQCMxA7PJVqrUoMTZm6PV7FXBlXAAIJQKAoATzIOeqDeFnsgYAKwgMXm+AAhPhzuF8DZDYk4EQYMwoBwFtdAmNVBoIoIRD56JFhEhPANbpCYnVNNNa4E4GM5Iomx3W+2RF3YkQpDFYgOh8OOl0evR8ARGqXV4F6MEkDu98P6KbvubLSBrXaHc6afCpVTkce92MAPRjmCD3fD+tqdQfxPOsWDYTgVz3cwYBbAAibEBVSFw1SlGCINXdA0E7PIkmAIRgEEQoUFqIQfBgmIBSFVDfxPTh3Cw1ssRxPFaVfYCbggHooFIpIhGYJAqLY98gOAsZQPYDg0OHKDYL5BC0lVR8-gEti4AwrDgBwvCCKIrpSIAE35ZismUtjaKITxPAYjhZKMmBWOAlpONIog9JMvchIgj8G0AocvIA4SDU0VFmi5CcZzmfgO3ESQYG7AwYGhK5Sx7FA+ygcIktXTARHkcJWS4IcUDw2IOExBKQG9OAYMwrI6hggrfzTXJzEwAQRk4BKsnCaraTq65NAawI5xixcMqHTAOt4YAAC8wjgAAmQ5BuHCasgAdSQYBYjEGBCySDi9PwZbAmvKBYhiPKADZloGqgzmC+xoHgAzMBQZghHgTpuggBIgA TypeScript playground].


=== نصائح مفيدة ===
== نصائح مفيدة ==
يمكنك الحصول على نصائح مفيدة من خلال ما يلي:
يمكنك الحصول على نصائح مفيدة من خلال ما يلي:


* [https://www.typescriptlang.org/docs/handbook/intro.html TypeScript Handbook]
* توثيق [[TypeScript/Guide|TypeScript]] العربي
* [https://reactjs.org/docs/static-type-checking.html#typescript توثيق React للغة TypeScript]
* [[React/static type checking#TypeScript|توثيق React للغة TypeScript]]
* تحتوي صفحة [https://github.com/typescript-cheatsheets/react#reacttypescript-cheatsheets React + TypeScript Cheatsheets] على نظرة عامة جيدة حول كيفية استخدام React مع TypeScript
* تحتوي صفحة [https://github.com/typescript-cheatsheets/react#reacttypescript-cheatsheets React + TypeScript Cheatsheets] على نظرة عامة جيدة حول كيفية استخدام React مع TypeScript.


=== استخدام تسمية المسار البديلة المخصَّصة Custom Path Aliases مع TypeScript ===
== استخدام تسمية المسار البديلة المخصصة مع TypeScript ==
يمكنك استخدام تسمية المسار البديلة المخصصة مع TypeScript من خلال ضبط تسمية المسار البديلة للعمل على كل من Babel و TypeScript كما يلي:
يمكنك استخدام تسمية المسار البديلة المخصصة Custom Path Aliases مع TypeScript من خلال ضبط تسمية المسار البديلة للعمل على كل من Babel و TypeScript كما يلي:


1. عدّل الملف <code>tsconfig.json</code> للحصول على [https://www.typescriptlang.org/docs/handbook/module-resolution.html#path-mapping روابط المسار المخصصة] custom path mappings الخاصة بك. اضبط أي شيء في جذر <code>src</code> ليكون متاحًا بدون مسار مرجعي سابق، واسمح بالوصول إلى أي ملف اختبار باستخدام <code>tests/File.tsx</code>:<syntaxhighlight lang="typescript">
1. عدّل الملف <code>tsconfig.json</code> للحصول على [https://www.typescriptlang.org/docs/handbook/module-resolution.html#path-mapping روابط المسار المخصصة] custom path mappings الخاصة بك. اضبط أي شيء في جذر <code>src</code> ليكون متاحًا بدون مسار مرجعي سابق، واسمح بالوصول إلى أي ملف اختبار باستخدام <code>tests/File.tsx</code>:<syntaxhighlight lang="typescript">
سطر 185: سطر 188:


* [https://reactnative.dev/docs/typescript صفحة Using TypeScript في توثيق React Native الرسمي.]
* [https://reactnative.dev/docs/typescript صفحة Using TypeScript في توثيق React Native الرسمي.]
[[تصنيف:ReactNative]]
[[تصنيف:React Native Docs]]

المراجعة الحالية بتاريخ 13:39، 9 أكتوبر 2021

تُعَد لغة TypeScript توسعةً للغة JavaScript من خلال إضافة تعريفات الأنواع مثل Flow. أُنشِأ إطار عمل React Native ضمن Flow، لكنه يدعم كلًا من TypeScript و Flow افتراضيًا.

كيفية البدء باستخدام لغة TypeScript

إذا بدأت مشروعًا جديدًا، فهناك عدة طرق مختلفة للبدء.

يمكنك استخدام قالب TypeScript من خلال:

npx react-native init MyApp --template react-native-template-typescript

ملاحظة: إن فشل الأمر السابق، فقد يكون لديك إصدار قديم من react-native أو react-native-cli مثبت عالميًا على نظامك. يمكن إصلاح المشكلة من خلال إلغاء تثبيت CLI أي: npm uninstall -g react-native-cli أو yarn global remove react-native-cli ثم شغّل الأمر npx مرة أخرى.

يمكنك استخدام Expo الذي يحتوي على قالبَي TypeScript من خلال:

  • في npm:
    npm install -g expo-cli
    expo init MyTSProject
    
  • في yarn:
    yarn global add expo-cli
    expo init MyTSProject
    
    أو يمكنك استخدام Ignite، الذي يحتوي أيضًا على قالب TypeScript من خلال:
  • في npm:
    npm install -g ignite-cli
    ignite new MyTSProject
    
  • في yarn:
    yarn global add ignite-cli
    ignite new MyTSProject
    

إضافة TypeScript إلى مشروع قائم

1. أضف TypeScript وأنواع React Native و Jest إلى مشروعك من خلال:

  • في npm:
    npm install -D typescript @types/jest @types/react @types/react-native @types/react-test-renderer
    
  • في yarn:
    yarn add -D typescript @types/jest @types/react @types/react-native @types/react-test-renderer
    
    2. أضف ملف إعداد config file خاص بلغة TypeScript، ثم أنشئ ملف tsconfig.json في جذر root مشروعك:
    {
      "compilerOptions": {
        "allowJs": true,
        "allowSyntheticDefaultImports": true,
        "esModuleInterop": true,
        "isolatedModules": true,
        "jsx": "react",
        "lib": ["es6"],
        "moduleResolution": "node",
        "noEmit": true,
        "strict": true,
        "target": "esnext"
      },
      "exclude": [
        "node_modules",
        "babel.config.js",
        "metro.config.js",
        "jest.config.js"
      ]
    }
    
    3. أنشئ ملف jest.config.js لإعداد Jest من أجل استخدام TypeScript:
    module.exports = {
      preset: 'react-native',
      moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node']
    };
    
    4. أعد تسمية ملف JavaScript ليصبح ‎*.tsx

    ملاحظة: يجب عليك ترك ملف نقطة الدخول ‎./index.js كما هو، وإلّا فقد تواجه مشكلة عندما يتعلق الأمر بتجميع bundling إصدار الإنتاج production build.

    5. شغّل الأمر yarn tsc لكتابة التحقق من أنواع ملفات TypeScript الجديدة.

كيف تعمل TypeScript مع React Native

يعمل تحويل ملفاتك إلى JavaScript باستخدام بنية Babel الأساسية نفسها لمشروع React Native بدون TypeScript. نوصي باستخدام مصرّف TypeScript للتحقق من الأنواع فقط. إذا كان لديك شيفرة TypeScript موجودة ومنقولة إلى React Native، فهناك تحذير أو اثنين لاستخدام Babel بدلًا من TypeScript.

كيف تبدو React Native مع TypeScript

يمكنك توفير واجهة لخاصيات Props وحالة State مكوّن React من خلال React.Component<Props, State>‎ والتي ستوفر تحققًا من النوع ومحرّرًا بإكمالٍ آلي عند العمل مع هذا المكون في JSX.

import React from 'react';
import { Button, StyleSheet, Text, View } from 'react-native';

export type Props = {
  name: string;
  baseEnthusiasmLevel?: number;
};

const Hello: React.FC<Props> = ({
  name,
  baseEnthusiasmLevel = 0
}) => {
  const [enthusiasmLevel, setEnthusiasmLevel] = React.useState(
    baseEnthusiasmLevel
  );

  const onIncrement = () =>
    setEnthusiasmLevel(enthusiasmLevel + 1);
  const onDecrement = () =>
    setEnthusiasmLevel(
      enthusiasmLevel > 0 ? enthusiasmLevel - 1 : 0
    );

  const getExclamationMarks = (numChars: number) =>
    numChars > 0 ? Array(numChars + 1).join('!') : '';

  return (
    <View style={styles.container}>
      <Text style={styles.greeting}>
        Hello {name}
        {getExclamationMarks(enthusiasmLevel)}
      </Text>
      <View>
        <Button
          title="Increase enthusiasm"
          accessibilityLabel="increment"
          onPress={onIncrement}
          color="blue"
        />
        <Button
          title="Decrease enthusiasm"
          accessibilityLabel="decrement"
          onPress={onDecrement}
          color="red"
        />
      </View>
    </View>
  );
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
    alignItems: 'center',
    justifyContent: 'center'
  },
  greeting: {
    fontSize: 20,
    fontWeight: 'bold',
    margin: 16
  }
});

export default Hello;

يمكنك استكشاف شكل الصياغة أكثر في TypeScript playground.

نصائح مفيدة

يمكنك الحصول على نصائح مفيدة من خلال ما يلي:

استخدام تسمية المسار البديلة المخصصة مع TypeScript

يمكنك استخدام تسمية المسار البديلة المخصصة Custom Path Aliases مع TypeScript من خلال ضبط تسمية المسار البديلة للعمل على كل من Babel و TypeScript كما يلي:

1. عدّل الملف tsconfig.json للحصول على روابط المسار المخصصة custom path mappings الخاصة بك. اضبط أي شيء في جذر src ليكون متاحًا بدون مسار مرجعي سابق، واسمح بالوصول إلى أي ملف اختبار باستخدام tests/File.tsx:

    "target": "esnext",
+     "baseUrl": ".",
+     "paths": {
+       "*": ["src/*"],
+       "tests": ["tests/*"],
+       "@components/*": ["src/components/*"],
+     },
    }

2. أضف babel-plugin-module-resolver كحزمة تطوير لمشروعك:

  • في npm:
npm install --save-dev babel-plugin-module-resolver
  • في yarn:
yarn add --dev babel-plugin-module-resolver

أخيرًا، اضبط babel.config.js (لاحظ أن صياغة babel.config.js الخاص بك تختلف عن صياغة tsconfig.json):

{
  plugins: [
+    [
+       'module-resolver',
+       {
+         root: ['./src'],
+         extensions: ['.ios.js', '.android.js', '.js', '.ts', '.tsx', '.json'],
+         alias: {
+           tests: ['./tests/'],
+           "@components": "./src/components",
+         }
+       }
+    ]
  ]
}

مصادر