SlideShare ist ein Scribd-Unternehmen logo
1 von 42
Downloaden Sie, um offline zu lesen
React Native
App With
TypeScript
Tutorial
www.bacancytechnology.com
Overview
Typescript is a superset of Javascript which
uses static typing, classes, interfaces and is
hence called Object Oriented programming
language (OOP). Many developers widely
use it to minimize errors and for type
checking in applications. Adding a strict
type makes it a more self-expressive code.
Due to the strict behavior, sometimes
developers find it difficult to work with
typescript in their project.


Typescript code can be run on any browser,
device, or operating system. Since
typescript is a superset of Javascript, it
compiles into Javascript, and every valid
Javascript is a valid Typescript. Typescript
detects bugs at the compile-time, so the
chances of getting errors reduce at the
runtime. Typescript has a disadvantage
over Javascript in that it takes time to
complete the code.
In this tutorial, we will learn about react
native app with typescript and see how can
we build a basic Quiz application.
Create React
Native App
Initially, create a react native app using the
below command.


react-native init QuizApp
cd QuizApp
Install
Dependencies
typescript: To install typescript
@types/react: To install react types for
typescript
@types/react-native: To install React
Native types for typescript
@types/react-test-renderer: To install
types for test-renderer for typescript
@types/jest: To install types for jest
testing for typescript
Use the below command to install the
dependencies.


npm install typescript @types/react
@types/react-native
@types/react-test-renderer @types/jest
Let’s see the purpose of the installed
typescript libraries.
We will require Axios for API calls and the
library required for the elements used in
code. Run the below command for the same.


npm install axios react-native-elements
TypeScript
Configuration
We need to configure Typescript for react-
native to work. Create a config file named
tsconfig.json using the tsc command.


tsc --init
Note– To use the tsc command, you need to
have typescript installed globally.


In order to build your react native app with
typescript, change App.js to App.tsx.
Create
Components
Screen
Components
API Call
Let’s get started with creating components
for our application. Our basic Quiz
application will consist of the following
components-


➡Quiz.tsx


➡Headers.tsx
➡Questions.tsx
➡Answers.tsx
➡Buttons.tsx
Now, we will go through each component
files step by step and look into the code.
import React, {FC} from 'react';
import {SafeAreaView, StyleSheet, Text,
StatusBar} from 'react-native';
interface Header {
title: string;
}
const HeaderClass: FC<Header> = props => {
return (
<SafeAreaView>
<StatusBar backgroundColor="white" />
<Text style={styles.textstyle}>{props.title}
</Text>
</SafeAreaView>
);
};
const styles = StyleSheet.create({
textstyle: {
// Headers.tsx
textAlign: 'center',
fontSize: 18,
},
});
export default HeaderClass;
Explanation:
interface Header {
title: string,
}
const HeaderClass: FC&lt;Header&gt;=
(props) =&gt; {/*content*/}
In typescript, we can define what to take and
how to take in the component. Here, we have
declared an interface named Header, which
defines a structure for the props object to
access the component. For that, define propsTo,
‘title’ with a specific type ‘string.’
Here comes the benefit- it gives us some
validation when we use this component.


Moreover, we have react native code which
shows the text as header title with style
defined to it.




// Buttons.tsx
import React, {FC} from 'react';
import {useEffect} from 'react';
import {SafeAreaView, StyleSheet, Text,
TouchableOpacity} from 'react-native';
interface Title {
key: number;
answer: string;
onPress: () => void;
correct: boolean;
disabled: boolean;
}
const Buttons: FC<Title> = props => {
useEffect(() => {}, []);
return (
<SafeAreaView>
<TouchableOpacity
style={{
backgroundColor: !props.disabled ?
'#F5F5DC' : '#F5DEB3',
width: '80%',
elevation: 5,
justifyContent: 'center',
alignContent: 'center',
marginLeft: 27,
height: 38,
marginTop: 10,
}}
onPress={() => {
props.onPress();
}}>
<Text
style={[
styles.textstyle,
{color: props.correct ? 'brown' : 'black'},
]}>
{props.answer}
</Text>
</TouchableOpacity>
</SafeAreaView>
);
};
const styles = StyleSheet.create({
textstyle: {
textAlign: 'left',
fontSize: 17,
marginLeft: 8,
},
});
export default Buttons;
In the file Buttons.tsx, we have an interface
named Title which holds the structure for
props. It changes style according to the
correct answer on pressing the button and
disables other buttons according to passed
props from the parent class.


// Answers.tsx
import React, {FC} from 'react';
import {SafeAreaView, StyleSheet, View}
from 'react-native';
import Buttons from
'../components/Buttons';
import {AnswerObject} from
'../screens/Quiz';
interface Answers {
useranswer: AnswerObject | undefined;
answers: string[];
setcorrectanswer: any;
checkanswer: () => void;
}
const Answers: FC<Answers> = props => {
return (
<SafeAreaView>
<View style={{marginTop: 10,
paddingHorizontal: 20}}>
{props.answers.map((answer, key) => {
return (
<View key={answer}>
<Buttons
{...{key, answer}}
correct={props.useranswer?.correctanswer
=== answer}
disabled={props.useranswer ? true : false}
onPress={() => {
(props.setcorrectanswer.current = answer),
props.checkanswer();
}}
/>
</View>
);
})}
</View>
</SafeAreaView>
);
};
const styles = StyleSheet.create({
questioncontainer: {
flexDirection: 'row',
alignItems: 'center',
backgroundColor: 'white',
marginTop: 10,
paddingRight: 16,
},
textstyle: {padding: 15, fontSize: 15, color:
'blue'},
});
export default Answers;
In this file, we have an interface named
Answers which defines an answer,
useranswer, having another type interface
AnswerObject (used in the class Quiz),
correctanswer, checkanswer function. This
file shows the multiple options below the
question to choose from the prop of the
child class.


// Question.tsx
import React, {FC} from 'react';
import {SafeAreaView, StyleSheet, Text,
View} from 'react-native';
interface Question {
QuestionNo: number;
Question: string;
}
const Questions: FC<Question> = props => {
return (
<SafeAreaView>
<View style={styles.questioncontainer}>
<Text style={styles.textstyle}>
{props.QuestionNo}</Text>
<Text
style={{
fontSize: 15,
color: 'black',
textAlign: 'left',
marginRight: 7,
}}>
{props.Question}
</Text>
</View>
</SafeAreaView>
);
};
const styles = StyleSheet.create({
questioncontainer: {
flexDirection: 'row',
alignItems: 'center',
backgroundColor: 'white',
marginTop: 10,
paddingRight: 16,
},
textstyle: {padding: 15, fontSize: 15, color:
'blue'},
});
export default Questions;
In this file we have an interface named
Question which defines props for
QuestionNo and Question.
// Quiz.tsx


import React, {FC, useEffect, useRef,
useState} from 'react';
import {
StyleSheet,
Text,
View,
TouchableOpacity,
ActivityIndicator,
} from 'react-native';
import {getquestiojns, Question} from
'../utils/api';
import Questions from
'../components/Question';
import Answers from
'../components/Answers';
import {Icon} from 'react-native-elements';


export type AnswerObject = {
question: string;
answer: string;
correct: boolean;
correctanswer: string;
};
const Quiz: FC = props => {
const [loader, setloader] = useState(false);
const [question, setquestion] =
useState<Question[]>([]);
const [useranswers, setuseranswers] =
useState<AnswerObject[]>([]);
const [score, setscore] = useState(0);
const [number, setnumber] = useState(0);
const [totalquestion] = useState(10);
const [gameover, setgameover] =
useState(true);
const setcorrectanswer = useRef(null);
const [correcta, setcorrecta] = useState('');
useEffect(() => {
startQuiz();
}, []);
const startQuiz = async () => {
setnumber(0);
setloader(true);
setgameover(false);
const newquestions = await getquestiojns();
console.log(newquestions);
setquestion(newquestions);
setscore(0);
setuseranswers([]);
setloader(false);
};
const nextQuestion = () => {
const nextq = number + 1;
if (nextq == totalquestion) {
setgameover(true);
} else {
setnumber(nextq);
}
};
const checkanswer = () => {
if (!gameover) {
const answer = setcorrectanswer.current;
const correcta =
question[number].correct_answer ===
answer;
if (correcta) setscore(prev => prev + 1);
const answerobject = {
question: question[number].question,
answer,
correcta,
correctanswer:
question[number].correct_answer,
};
setuseranswers(prev => [...prev,
answerobject]);
setTimeout(() => {
nextQuestion();
}, 1000);
}
};
return (
<View style={{flex: 1}}>
{!loader ? (
<View>
<View style={styles.container}>
<Text style=
{styles.textstyle}>Questions</Text>
<Text style={styles.textstyle}>
{number + 1}/{totalquestion}
</Text>
</View>
<View style={{marginLeft: 20}}>
<Text style={styles.textstyle}>Score :
{score}</Text>
</View>
{question.length > 0 ? (
<>
<Questions
QuestionNo={number + 1}
Question=
{question[number].question}
/>
<Answers
answers=
{question[number].answers}
{...{setcorrectanswer, checkanswer}}
useranswer={useranswers ?
useranswers[number] : undefined}
/>
</>
) : null}
</View>
) : (
<ActivityIndicator
style={{justifyContent: 'center', top:
200}}
size={50}
color="black"
/>
)}
<View>
{!gameover && !loader && number !=
totalquestion - 1 ? (
<TouchableOpacity onPress={() =>
nextQuestion()}>
<Icon
name="arrowright"
size={40}
color="black"
type="antdesign"
style={{left: 130, margin: 20}}
/>
</TouchableOpacity>
) : number == totalquestion - 1 ? (
<TouchableOpacity onPress={() =>
startQuiz()}>
<Icon
name="controller-play"
size={40}
color="black"
type="entypo"
style={{left: 130, margin: 20}}
/>
</TouchableOpacity>
) : null}
</View>
</View>
);
};
const styles = StyleSheet.create({
container: {
flexDirection: 'row',
justifyContent: 'space-between',
marginTop: 70,
backgroundColor: 'white',
},
textstyle: {padding: 15, fontSize: 15, color:
'blue'},
bottomview: {
padding: 13,
backgroundColor: 'blue',
borderRadius: 300,
width: 70,
height: 70,
</TouchableOpacity>
) : null}
</View>
</View>
);
};
const styles = StyleSheet.create({
container: {
flexDirection: 'row',
justifyContent: 'space-between',
marginTop: 70,
backgroundColor: 'white',
},
textstyle: {padding: 15, fontSize: 15, color:
'blue'},
bottomview: {
padding: 13,
backgroundColor: 'blue',
borderRadius: 300,
width: 70,
height: 70,
position: 'absolute',
right: 20,
top: 550,
},
questioncontainer: {
flexDirection: 'row',
alignItems: 'center',
backgroundColor: 'white',
marginTop: 10,
paddingRight: 16,
},
iconstyle: {
backgroundColor: 'blue',
borderRadius: 50,
width: 70,
height: 70,
margin: 5,
top: 100,
left: 260,
},
});
export default Quiz;
This is the main screen which is shown on
loading. When the screen gets rendered, it
sets all the states to the initial phases and
calls API to set questions and options to
display. When API returns data, the Question
and Answers classes are called to render the
items with the help of props.


The answers class uses a function called
checkanswer, which checks the current
reference of the selected answer and checks it
with the API’s correct answer. If they match,
then the score gets increased by one and
proceeds to the next question.
import axios from 'axios';
export const _ = (array: any[]) =>
[...array].sort(() => Math.random() - 0.7);
export type Question = {
category: string;
incorrect_answers: string[];
correct_answer: string;
difficulty: string;
question: string;
type: string;
};
export const getquestiojns = async () => {
const endpoint =
'https://opentdb.com/api.php?
amount=10&category=9';
const promise = await axios.get(endpoint);
return promise.data.results.map((question:
Question) => ({
// src/utils/api.tsx
...question,
answers: _([...question.incorrect_answers,
question.correct_answer]),
}));
};
In this file, we have an interface named
Question, which has a structure to use as
props to return the desired options in this
Quiz App. It uses the Axios library to fetch
details from the API. It returns the result
from API, which has questions and answers
based on multiple options.
Github
Repository:
React Native
App with
Typescript
You can visit here – Github Repository and
play around with code or follow the steps
mentioned above for developing a React
Native app with Typescript.
Conclusion
So, this was all about building a basic React
Native App with Typescript. A simple Quiz
application flow to better understand how
typescript works in react native. I hope
your purpose for landing on this tutorial
has been fulfilled. For more such tutorials,
feel free to visit the React Native tutorials
page. We have step-by-step guidelines
comprising basic and advanced React
Native knowledge; we also provide source
code to explore on your own.


In case you are looking for skilled and
dedicated React Native developers for your
project, please contact us without giving a
second thought and hire React Native
developer.
Thank You
www.bacancytechnology.com

Weitere ähnliche Inhalte

Was ist angesagt?

Introduction aux systèmes d'exploitation mobile
Introduction aux systèmes d'exploitation mobileIntroduction aux systèmes d'exploitation mobile
Introduction aux systèmes d'exploitation mobile
Houssem Rouini
 
Base de datos con Netbeans
Base de datos con NetbeansBase de datos con Netbeans
Base de datos con Netbeans
Randy
 

Was ist angesagt? (20)

JEE_Chapter4_JSF_VF (1).pdf
JEE_Chapter4_JSF_VF (1).pdfJEE_Chapter4_JSF_VF (1).pdf
JEE_Chapter4_JSF_VF (1).pdf
 
Angular Dependency Injection
Angular Dependency InjectionAngular Dependency Injection
Angular Dependency Injection
 
Using Dagger in a Clean Architecture project
Using Dagger in a Clean Architecture projectUsing Dagger in a Clean Architecture project
Using Dagger in a Clean Architecture project
 
UDA-Componentes RUP. Tabla Avanzada
UDA-Componentes RUP. Tabla AvanzadaUDA-Componentes RUP. Tabla Avanzada
UDA-Componentes RUP. Tabla Avanzada
 
Better web apps with React and Redux
Better web apps with React and ReduxBetter web apps with React and Redux
Better web apps with React and Redux
 
Doctrine with Symfony - SymfonyCon 2019
Doctrine with Symfony - SymfonyCon 2019Doctrine with Symfony - SymfonyCon 2019
Doctrine with Symfony - SymfonyCon 2019
 
Angular 9
Angular 9 Angular 9
Angular 9
 
React
ReactReact
React
 
Alphorm.com Formation PRTG Network Monitor : installation et configuration
Alphorm.com Formation PRTG Network Monitor : installation et configurationAlphorm.com Formation PRTG Network Monitor : installation et configuration
Alphorm.com Formation PRTG Network Monitor : installation et configuration
 
Reactjs Basics
Reactjs BasicsReactjs Basics
Reactjs Basics
 
React JS
React JSReact JS
React JS
 
Clean code: SOLID (iOS)
Clean code: SOLID (iOS)Clean code: SOLID (iOS)
Clean code: SOLID (iOS)
 
Design patterns french
Design patterns frenchDesign patterns french
Design patterns french
 
UDA-Componentes RUP. Feedback
UDA-Componentes RUP. FeedbackUDA-Componentes RUP. Feedback
UDA-Componentes RUP. Feedback
 
Introduction aux systèmes d'exploitation mobile
Introduction aux systèmes d'exploitation mobileIntroduction aux systèmes d'exploitation mobile
Introduction aux systèmes d'exploitation mobile
 
UDA-Anexo configuración y uso de jackson
UDA-Anexo configuración y uso de jacksonUDA-Anexo configuración y uso de jackson
UDA-Anexo configuración y uso de jackson
 
Base de datos con Netbeans
Base de datos con NetbeansBase de datos con Netbeans
Base de datos con Netbeans
 
cours-gratuit.com--id-4422.pdf
cours-gratuit.com--id-4422.pdfcours-gratuit.com--id-4422.pdf
cours-gratuit.com--id-4422.pdf
 
Introduction to the Dart language
Introduction to the Dart languageIntroduction to the Dart language
Introduction to the Dart language
 
Intro to React
Intro to ReactIntro to React
Intro to React
 

Ähnlich wie React native app with type script tutorial

Ähnlich wie React native app with type script tutorial (20)

Паразитируем на React-экосистеме (Angular 4+) / Алексей Охрименко (IPONWEB)
Паразитируем на React-экосистеме (Angular 4+) / Алексей Охрименко (IPONWEB)Паразитируем на React-экосистеме (Angular 4+) / Алексей Охрименко (IPONWEB)
Паразитируем на React-экосистеме (Angular 4+) / Алексей Охрименко (IPONWEB)
 
Introduction to React for Frontend Developers
Introduction to React for Frontend DevelopersIntroduction to React for Frontend Developers
Introduction to React for Frontend Developers
 
Connect.js - Exploring React.Native
Connect.js - Exploring React.NativeConnect.js - Exploring React.Native
Connect.js - Exploring React.Native
 
Academy PRO: React native - building first scenes
Academy PRO: React native - building first scenesAcademy PRO: React native - building first scenes
Academy PRO: React native - building first scenes
 
Server side rendering with React and Symfony
Server side rendering with React and SymfonyServer side rendering with React and Symfony
Server side rendering with React and Symfony
 
Murach : How to work with session state and cookies
Murach : How to work with session state and cookiesMurach : How to work with session state and cookies
Murach : How to work with session state and cookies
 
How React Native, Appium and me made each other shine @ContinuousDeliveryAmst...
How React Native, Appium and me made each other shine @ContinuousDeliveryAmst...How React Native, Appium and me made each other shine @ContinuousDeliveryAmst...
How React Native, Appium and me made each other shine @ContinuousDeliveryAmst...
 
Typescript language extension of java script
Typescript language extension of java scriptTypescript language extension of java script
Typescript language extension of java script
 
React mit TypeScript – eine glückliche Ehe
React mit TypeScript – eine glückliche EheReact mit TypeScript – eine glückliche Ehe
React mit TypeScript – eine glückliche Ehe
 
Angular 2 for Java Developers
Angular 2 for Java DevelopersAngular 2 for Java Developers
Angular 2 for Java Developers
 
How to perform debounce in react
How to perform debounce in reactHow to perform debounce in react
How to perform debounce in react
 
Workshop 23: ReactJS, React & Redux testing
Workshop 23: ReactJS, React & Redux testingWorkshop 23: ReactJS, React & Redux testing
Workshop 23: ReactJS, React & Redux testing
 
Ways to Set Focus on an Input Field After Rendering in React.pptx
Ways to Set Focus on an Input Field After Rendering in React.pptxWays to Set Focus on an Input Field After Rendering in React.pptx
Ways to Set Focus on an Input Field After Rendering in React.pptx
 
Simple React Todo List
Simple React Todo ListSimple React Todo List
Simple React Todo List
 
Lessons from a year of building apps with React Native
Lessons from a year of building apps with React NativeLessons from a year of building apps with React Native
Lessons from a year of building apps with React Native
 
MOPCON 2014 - Best software architecture in app development
MOPCON 2014 - Best software architecture in app developmentMOPCON 2014 - Best software architecture in app development
MOPCON 2014 - Best software architecture in app development
 
Mobile Open Day: React Native: Crossplatform fast dive
Mobile Open Day: React Native: Crossplatform fast diveMobile Open Day: React Native: Crossplatform fast dive
Mobile Open Day: React Native: Crossplatform fast dive
 
reactjs-quiz..docs.pdf
reactjs-quiz..docs.pdfreactjs-quiz..docs.pdf
reactjs-quiz..docs.pdf
 
React render props
React render propsReact render props
React render props
 
How to build to do app using vue composition api and vuex 4 with typescript
How to build to do app using vue composition api and vuex 4 with typescriptHow to build to do app using vue composition api and vuex 4 with typescript
How to build to do app using vue composition api and vuex 4 with typescript
 

Mehr von Katy Slemon

Mehr von Katy Slemon (20)

React Alternatives Frameworks- Lightweight Javascript Libraries.pdf
React Alternatives Frameworks- Lightweight Javascript Libraries.pdfReact Alternatives Frameworks- Lightweight Javascript Libraries.pdf
React Alternatives Frameworks- Lightweight Javascript Libraries.pdf
 
Data Science Use Cases in Retail & Healthcare Industries.pdf
Data Science Use Cases in Retail & Healthcare Industries.pdfData Science Use Cases in Retail & Healthcare Industries.pdf
Data Science Use Cases in Retail & Healthcare Industries.pdf
 
How Much Does It Cost To Hire Golang Developer.pdf
How Much Does It Cost To Hire Golang Developer.pdfHow Much Does It Cost To Hire Golang Developer.pdf
How Much Does It Cost To Hire Golang Developer.pdf
 
What’s New in Flutter 3.pdf
What’s New in Flutter 3.pdfWhat’s New in Flutter 3.pdf
What’s New in Flutter 3.pdf
 
Why Use Ruby On Rails.pdf
Why Use Ruby On Rails.pdfWhy Use Ruby On Rails.pdf
Why Use Ruby On Rails.pdf
 
How Much Does It Cost To Hire Full Stack Developer In 2022.pdf
How Much Does It Cost To Hire Full Stack Developer In 2022.pdfHow Much Does It Cost To Hire Full Stack Developer In 2022.pdf
How Much Does It Cost To Hire Full Stack Developer In 2022.pdf
 
How to Implement Middleware Pipeline in VueJS.pdf
How to Implement Middleware Pipeline in VueJS.pdfHow to Implement Middleware Pipeline in VueJS.pdf
How to Implement Middleware Pipeline in VueJS.pdf
 
How to Build Laravel Package Using Composer.pdf
How to Build Laravel Package Using Composer.pdfHow to Build Laravel Package Using Composer.pdf
How to Build Laravel Package Using Composer.pdf
 
Sure Shot Ways To Improve And Scale Your Node js Performance.pdf
Sure Shot Ways To Improve And Scale Your Node js Performance.pdfSure Shot Ways To Improve And Scale Your Node js Performance.pdf
Sure Shot Ways To Improve And Scale Your Node js Performance.pdf
 
How to Develop Slack Bot Using Golang.pdf
How to Develop Slack Bot Using Golang.pdfHow to Develop Slack Bot Using Golang.pdf
How to Develop Slack Bot Using Golang.pdf
 
IoT Based Battery Management System in Electric Vehicles.pdf
IoT Based Battery Management System in Electric Vehicles.pdfIoT Based Battery Management System in Electric Vehicles.pdf
IoT Based Battery Management System in Electric Vehicles.pdf
 
Understanding Flexbox Layout in React Native.pdf
Understanding Flexbox Layout in React Native.pdfUnderstanding Flexbox Layout in React Native.pdf
Understanding Flexbox Layout in React Native.pdf
 
The Ultimate Guide to Laravel Performance Optimization in 2022.pdf
The Ultimate Guide to Laravel Performance Optimization in 2022.pdfThe Ultimate Guide to Laravel Performance Optimization in 2022.pdf
The Ultimate Guide to Laravel Performance Optimization in 2022.pdf
 
New Features in iOS 15 and Swift 5.5.pdf
New Features in iOS 15 and Swift 5.5.pdfNew Features in iOS 15 and Swift 5.5.pdf
New Features in iOS 15 and Swift 5.5.pdf
 
How to Hire & Manage Dedicated Team For Your Next Product Development.pdf
How to Hire & Manage Dedicated Team For Your Next Product Development.pdfHow to Hire & Manage Dedicated Team For Your Next Product Development.pdf
How to Hire & Manage Dedicated Team For Your Next Product Development.pdf
 
Choose the Right Battery Management System for Lithium Ion Batteries.pdf
Choose the Right Battery Management System for Lithium Ion Batteries.pdfChoose the Right Battery Management System for Lithium Ion Batteries.pdf
Choose the Right Battery Management System for Lithium Ion Batteries.pdf
 
Flutter Performance Tuning Best Practices From the Pros.pdf
Flutter Performance Tuning Best Practices From the Pros.pdfFlutter Performance Tuning Best Practices From the Pros.pdf
Flutter Performance Tuning Best Practices From the Pros.pdf
 
Angular Universal How to Build Angular SEO Friendly App.pdf
Angular Universal How to Build Angular SEO Friendly App.pdfAngular Universal How to Build Angular SEO Friendly App.pdf
Angular Universal How to Build Angular SEO Friendly App.pdf
 
How to Set Up and Send Mails Using SendGrid in NodeJs App.pdf
How to Set Up and Send Mails Using SendGrid in NodeJs App.pdfHow to Set Up and Send Mails Using SendGrid in NodeJs App.pdf
How to Set Up and Send Mails Using SendGrid in NodeJs App.pdf
 
Ruby On Rails Performance Tuning Guide.pdf
Ruby On Rails Performance Tuning Guide.pdfRuby On Rails Performance Tuning Guide.pdf
Ruby On Rails Performance Tuning Guide.pdf
 

Kürzlich hochgeladen

Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Victor Rentea
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Victor Rentea
 

Kürzlich hochgeladen (20)

"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 
Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 

React native app with type script tutorial

  • 3. Typescript is a superset of Javascript which uses static typing, classes, interfaces and is hence called Object Oriented programming language (OOP). Many developers widely use it to minimize errors and for type checking in applications. Adding a strict type makes it a more self-expressive code. Due to the strict behavior, sometimes developers find it difficult to work with typescript in their project. Typescript code can be run on any browser, device, or operating system. Since typescript is a superset of Javascript, it compiles into Javascript, and every valid Javascript is a valid Typescript. Typescript detects bugs at the compile-time, so the chances of getting errors reduce at the runtime. Typescript has a disadvantage over Javascript in that it takes time to complete the code.
  • 4. In this tutorial, we will learn about react native app with typescript and see how can we build a basic Quiz application.
  • 6. Initially, create a react native app using the below command. react-native init QuizApp cd QuizApp
  • 8. typescript: To install typescript @types/react: To install react types for typescript @types/react-native: To install React Native types for typescript @types/react-test-renderer: To install types for test-renderer for typescript @types/jest: To install types for jest testing for typescript Use the below command to install the dependencies. npm install typescript @types/react @types/react-native @types/react-test-renderer @types/jest Let’s see the purpose of the installed typescript libraries.
  • 9. We will require Axios for API calls and the library required for the elements used in code. Run the below command for the same. npm install axios react-native-elements
  • 11. We need to configure Typescript for react- native to work. Create a config file named tsconfig.json using the tsc command. tsc --init Note– To use the tsc command, you need to have typescript installed globally. In order to build your react native app with typescript, change App.js to App.tsx.
  • 13. Screen Components API Call Let’s get started with creating components for our application. Our basic Quiz application will consist of the following components- ➡Quiz.tsx ➡Headers.tsx ➡Questions.tsx ➡Answers.tsx ➡Buttons.tsx Now, we will go through each component files step by step and look into the code.
  • 14. import React, {FC} from 'react'; import {SafeAreaView, StyleSheet, Text, StatusBar} from 'react-native'; interface Header { title: string; } const HeaderClass: FC<Header> = props => { return ( <SafeAreaView> <StatusBar backgroundColor="white" /> <Text style={styles.textstyle}>{props.title} </Text> </SafeAreaView> ); }; const styles = StyleSheet.create({ textstyle: { // Headers.tsx
  • 15. textAlign: 'center', fontSize: 18, }, }); export default HeaderClass; Explanation: interface Header { title: string, } const HeaderClass: FC&lt;Header&gt;= (props) =&gt; {/*content*/} In typescript, we can define what to take and how to take in the component. Here, we have declared an interface named Header, which defines a structure for the props object to access the component. For that, define propsTo, ‘title’ with a specific type ‘string.’
  • 16. Here comes the benefit- it gives us some validation when we use this component. Moreover, we have react native code which shows the text as header title with style defined to it. // Buttons.tsx import React, {FC} from 'react'; import {useEffect} from 'react'; import {SafeAreaView, StyleSheet, Text, TouchableOpacity} from 'react-native'; interface Title { key: number; answer: string; onPress: () => void; correct: boolean; disabled: boolean; }
  • 17. const Buttons: FC<Title> = props => { useEffect(() => {}, []); return ( <SafeAreaView> <TouchableOpacity style={{ backgroundColor: !props.disabled ? '#F5F5DC' : '#F5DEB3', width: '80%', elevation: 5, justifyContent: 'center', alignContent: 'center', marginLeft: 27, height: 38, marginTop: 10, }} onPress={() => { props.onPress(); }}> <Text style={[ styles.textstyle,
  • 18. {color: props.correct ? 'brown' : 'black'}, ]}> {props.answer} </Text> </TouchableOpacity> </SafeAreaView> ); }; const styles = StyleSheet.create({ textstyle: { textAlign: 'left', fontSize: 17, marginLeft: 8, }, }); export default Buttons;
  • 19. In the file Buttons.tsx, we have an interface named Title which holds the structure for props. It changes style according to the correct answer on pressing the button and disables other buttons according to passed props from the parent class. // Answers.tsx import React, {FC} from 'react'; import {SafeAreaView, StyleSheet, View} from 'react-native'; import Buttons from '../components/Buttons'; import {AnswerObject} from '../screens/Quiz'; interface Answers { useranswer: AnswerObject | undefined; answers: string[]; setcorrectanswer: any; checkanswer: () => void;
  • 20. } const Answers: FC<Answers> = props => { return ( <SafeAreaView> <View style={{marginTop: 10, paddingHorizontal: 20}}> {props.answers.map((answer, key) => { return ( <View key={answer}> <Buttons {...{key, answer}} correct={props.useranswer?.correctanswer === answer} disabled={props.useranswer ? true : false} onPress={() => { (props.setcorrectanswer.current = answer), props.checkanswer(); }} /> </View> );
  • 21. })} </View> </SafeAreaView> ); }; const styles = StyleSheet.create({ questioncontainer: { flexDirection: 'row', alignItems: 'center', backgroundColor: 'white', marginTop: 10, paddingRight: 16, }, textstyle: {padding: 15, fontSize: 15, color: 'blue'}, }); export default Answers;
  • 22. In this file, we have an interface named Answers which defines an answer, useranswer, having another type interface AnswerObject (used in the class Quiz), correctanswer, checkanswer function. This file shows the multiple options below the question to choose from the prop of the child class. // Question.tsx import React, {FC} from 'react'; import {SafeAreaView, StyleSheet, Text, View} from 'react-native'; interface Question { QuestionNo: number; Question: string; } const Questions: FC<Question> = props => { return ( <SafeAreaView>
  • 23. <View style={styles.questioncontainer}> <Text style={styles.textstyle}> {props.QuestionNo}</Text> <Text style={{ fontSize: 15, color: 'black', textAlign: 'left', marginRight: 7, }}> {props.Question} </Text> </View> </SafeAreaView> ); }; const styles = StyleSheet.create({ questioncontainer: { flexDirection: 'row', alignItems: 'center', backgroundColor: 'white',
  • 24. marginTop: 10, paddingRight: 16, }, textstyle: {padding: 15, fontSize: 15, color: 'blue'}, }); export default Questions; In this file we have an interface named Question which defines props for QuestionNo and Question.
  • 25. // Quiz.tsx import React, {FC, useEffect, useRef, useState} from 'react'; import { StyleSheet, Text, View, TouchableOpacity, ActivityIndicator, } from 'react-native'; import {getquestiojns, Question} from '../utils/api'; import Questions from '../components/Question'; import Answers from '../components/Answers'; import {Icon} from 'react-native-elements'; export type AnswerObject = { question: string;
  • 26. answer: string; correct: boolean; correctanswer: string; }; const Quiz: FC = props => { const [loader, setloader] = useState(false); const [question, setquestion] = useState<Question[]>([]); const [useranswers, setuseranswers] = useState<AnswerObject[]>([]); const [score, setscore] = useState(0); const [number, setnumber] = useState(0); const [totalquestion] = useState(10); const [gameover, setgameover] = useState(true); const setcorrectanswer = useRef(null); const [correcta, setcorrecta] = useState(''); useEffect(() => { startQuiz(); }, []);
  • 27. const startQuiz = async () => { setnumber(0); setloader(true); setgameover(false); const newquestions = await getquestiojns(); console.log(newquestions); setquestion(newquestions); setscore(0); setuseranswers([]); setloader(false); }; const nextQuestion = () => { const nextq = number + 1; if (nextq == totalquestion) { setgameover(true); } else { setnumber(nextq); } }; const checkanswer = () => { if (!gameover) { const answer = setcorrectanswer.current;
  • 28. const correcta = question[number].correct_answer === answer; if (correcta) setscore(prev => prev + 1); const answerobject = { question: question[number].question, answer, correcta, correctanswer: question[number].correct_answer, }; setuseranswers(prev => [...prev, answerobject]); setTimeout(() => { nextQuestion(); }, 1000); } };
  • 29. return ( <View style={{flex: 1}}> {!loader ? ( <View> <View style={styles.container}> <Text style= {styles.textstyle}>Questions</Text> <Text style={styles.textstyle}> {number + 1}/{totalquestion} </Text> </View> <View style={{marginLeft: 20}}> <Text style={styles.textstyle}>Score : {score}</Text> </View> {question.length > 0 ? ( <> <Questions QuestionNo={number + 1} Question= {question[number].question}
  • 30. /> <Answers answers= {question[number].answers} {...{setcorrectanswer, checkanswer}} useranswer={useranswers ? useranswers[number] : undefined} /> </> ) : null} </View> ) : ( <ActivityIndicator style={{justifyContent: 'center', top: 200}} size={50} color="black" /> )}
  • 31. <View> {!gameover && !loader && number != totalquestion - 1 ? ( <TouchableOpacity onPress={() => nextQuestion()}> <Icon name="arrowright" size={40} color="black" type="antdesign" style={{left: 130, margin: 20}} /> </TouchableOpacity> ) : number == totalquestion - 1 ? ( <TouchableOpacity onPress={() => startQuiz()}> <Icon name="controller-play" size={40} color="black" type="entypo" style={{left: 130, margin: 20}} />
  • 32. </TouchableOpacity> ) : null} </View> </View> ); }; const styles = StyleSheet.create({ container: { flexDirection: 'row', justifyContent: 'space-between', marginTop: 70, backgroundColor: 'white', }, textstyle: {padding: 15, fontSize: 15, color: 'blue'}, bottomview: { padding: 13, backgroundColor: 'blue', borderRadius: 300, width: 70, height: 70,
  • 33. </TouchableOpacity> ) : null} </View> </View> ); }; const styles = StyleSheet.create({ container: { flexDirection: 'row', justifyContent: 'space-between', marginTop: 70, backgroundColor: 'white', }, textstyle: {padding: 15, fontSize: 15, color: 'blue'}, bottomview: { padding: 13, backgroundColor: 'blue', borderRadius: 300, width: 70, height: 70,
  • 34. position: 'absolute', right: 20, top: 550, }, questioncontainer: { flexDirection: 'row', alignItems: 'center', backgroundColor: 'white', marginTop: 10, paddingRight: 16, }, iconstyle: { backgroundColor: 'blue', borderRadius: 50, width: 70, height: 70, margin: 5, top: 100, left: 260, }, }); export default Quiz;
  • 35. This is the main screen which is shown on loading. When the screen gets rendered, it sets all the states to the initial phases and calls API to set questions and options to display. When API returns data, the Question and Answers classes are called to render the items with the help of props. The answers class uses a function called checkanswer, which checks the current reference of the selected answer and checks it with the API’s correct answer. If they match, then the score gets increased by one and proceeds to the next question.
  • 36. import axios from 'axios'; export const _ = (array: any[]) => [...array].sort(() => Math.random() - 0.7); export type Question = { category: string; incorrect_answers: string[]; correct_answer: string; difficulty: string; question: string; type: string; }; export const getquestiojns = async () => { const endpoint = 'https://opentdb.com/api.php? amount=10&category=9'; const promise = await axios.get(endpoint); return promise.data.results.map((question: Question) => ({ // src/utils/api.tsx
  • 37. ...question, answers: _([...question.incorrect_answers, question.correct_answer]), })); }; In this file, we have an interface named Question, which has a structure to use as props to return the desired options in this Quiz App. It uses the Axios library to fetch details from the API. It returns the result from API, which has questions and answers based on multiple options.
  • 39. You can visit here – Github Repository and play around with code or follow the steps mentioned above for developing a React Native app with Typescript.
  • 41. So, this was all about building a basic React Native App with Typescript. A simple Quiz application flow to better understand how typescript works in react native. I hope your purpose for landing on this tutorial has been fulfilled. For more such tutorials, feel free to visit the React Native tutorials page. We have step-by-step guidelines comprising basic and advanced React Native knowledge; we also provide source code to explore on your own. In case you are looking for skilled and dedicated React Native developers for your project, please contact us without giving a second thought and hire React Native developer.