الفرق بين المراجعتين لصفحة: «ReactNative/typescript»
أنشأ الصفحة ب'== استخدام لغة TypeScript ==' |
لا ملخص تعديل |
||
سطر 1: | سطر 1: | ||
== استخدام لغة TypeScript == | == استخدام لغة TypeScript == | ||
تُعَد لغة [[TypeScript]] توسعةً للغة JavaScript من خلال إضافة تعريفات الأنواع مثل [https://flow.org/ Flow]، بينما أُنشِأ إطار عمل React Native ضمن Flow، فهو يدعم كلًا من TypeScript و Flow افتراضيًا. | |||
=== كيفية البدء باستخدام TypeScript === | |||
إذا بدأت مشروعًا جديدًا، فهناك عدة طرق مختلفة للبدء. | |||
يمكنك استخدام [https://github.com/react-native-community/react-native-template-typescript قالب TypeScript] من خلال:<syntaxhighlight lang="bash"> | |||
npx react-native init MyApp --template react-native-template-typescript | |||
</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 من خلال: | |||
'''في npm:'''<syntaxhighlight lang="bash"> | |||
npm install -g expo-cli | |||
expo init MyTSProject | |||
</syntaxhighlight>'''في yarn:'''<syntaxhighlight lang="bash"> | |||
yarn global add expo-cli | |||
expo init MyTSProject | |||
</syntaxhighlight>أو يمكنك استخدام [https://github.com/infinitered/ignite Ignite]، الذي يحتوي أيضًا على قالب TypeScript من خلال: | |||
'''في npm:'''<syntaxhighlight lang="bash"> | |||
npm install -g ignite-cli | |||
ignite new MyTSProject | |||
</syntaxhighlight>'''في yarn:'''<syntaxhighlight lang="bash"> | |||
yarn global add ignite-cli | |||
ignite new MyTSProject | |||
</syntaxhighlight> | |||
=== إضافة TypeScript إلى مشروع قائم === | |||
1. أضف TypeScript وأنواع React Native و Jest إلى مشروعك من خلال: | |||
'''في npm:'''<syntaxhighlight lang="bash"> | |||
npm install -D typescript @types/jest @types/react @types/react-native @types/react-test-renderer | |||
</syntaxhighlight>'''في yarn:'''<syntaxhighlight lang="bash"> | |||
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"> | |||
{ | |||
"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" | |||
] | |||
} | |||
</syntaxhighlight>3. أنشئ ملف <code>jest.config.js</code> لإعداد Jest من أجل استخدام TypeScript:<syntaxhighlight lang="typescript"> | |||
module.exports = { | |||
preset: 'react-native', | |||
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 الجديدة. | |||
=== كيف تعمل 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. | |||
=== كيف تبدو React Native + TypeScript === | |||
يمكنك توفير واجهة لخصائص Props وحالة State مكوّن React من خلال <code><React.Component<Props, State</code> والتي ستوفر تحققًا من النوع ومحرّرًا بإكمالٍ آلي عند العمل مع هذا المكون في JSX.<syntaxhighlight lang="typescript"> | |||
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; | |||
</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] | |||
* [https://reactjs.org/docs/static-type-checking.html#typescript توثيق React للغة TypeScript] | |||
* تحتوي [https://github.com/typescript-cheatsheets/react#reacttypescript-cheatsheets React + TypeScript Cheatsheets] على نظرة عامة جيدة حول كيفية استخدام React مع TypeScript | |||
=== استخدام تسمية المسار البديلة المخصَّصة Custom Path Aliases مع TypeScript === | |||
يمكنك استخدام تسمية المسار البديلة المخصصة مع 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"> | |||
"target": "esnext", | |||
+ "baseUrl": ".", | |||
+ "paths": { | |||
+ "*": ["src/*"], | |||
+ "tests": ["tests/*"], | |||
+ "@components/*": ["src/components/*"], | |||
+ }, | |||
} | |||
</syntaxhighlight>2. أضف <code>[https://github.com/tleunen/babel-plugin-module-resolver babel-plugin-module-resolver]</code> كحزمة تطوير لمشروعك: | |||
* '''في npm:''' | |||
<syntaxhighlight lang="bash"> | |||
npm install --save-dev babel-plugin-module-resolver | |||
</syntaxhighlight> | |||
* '''في yarn:''' | |||
<syntaxhighlight lang="bash"> | |||
yarn add --dev babel-plugin-module-resolver | |||
</syntaxhighlight>أخيرًا، اضبط <code>babel.config.js</code> (لاحظ أن صياغة <code>babel.config.js</code> الخاص بك يختلف عن <code>tsconfig.json</code>):<syntaxhighlight lang="typescript"> | |||
{ | |||
plugins: [ | |||
+ [ | |||
+ 'module-resolver', | |||
+ { | |||
+ root: ['./src'], | |||
+ extensions: ['.ios.js', '.android.js', '.js', '.ts', '.tsx', '.json'], | |||
+ alias: { | |||
+ tests: ['./tests/'], | |||
+ "@components": "./src/components", | |||
+ } | |||
+ } | |||
+ ] | |||
] | |||
} | |||
</syntaxhighlight> | |||
== مصادر == | |||
* [https://reactnative.dev/docs/typescript صفحة Using TypeScript في توثيق React Native الرسمي.] |
مراجعة 12:26، 29 مايو 2021
استخدام لغة TypeScript
تُعَد لغة 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 Handbook
- توثيق React للغة TypeScript
- تحتوي React + TypeScript Cheatsheets على نظرة عامة جيدة حول كيفية استخدام React مع TypeScript
استخدام تسمية المسار البديلة المخصَّصة Custom Path Aliases مع TypeScript
يمكنك استخدام تسمية المسار البديلة المخصصة مع 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",
+ }
+ }
+ ]
]
}