SlideShare a Scribd company logo
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

More Related Content

PDF
ReactJS presentation
PPT
PPT
Python Introduction
PPT
React js
PDF
Introduction to ReactJS
PPTX
Node js Introduction
PPTX
Introduction to Node js
ReactJS presentation
Python Introduction
React js
Introduction to ReactJS
Node js Introduction
Introduction to Node js

What's hot (20)

PDF
React Router: React Meetup XXL
PDF
How to go about testing in React?
PDF
TypeScript - An Introduction
PPTX
Nodejs buffers
PPTX
Express js
PPTX
React hooks
PPTX
NodeJS - Server Side JS
PDF
Basics of Model/View Qt programming
 
PPTX
React workshop
PDF
JavaScript - Chapter 3 - Introduction
PDF
An introduction to React.js
PDF
NextJS - Online Summit for Frontend Developers September 2020
PPTX
React JS - A quick introduction tutorial
PPTX
Introducing type script
PPTX
Asp.net mvc 5 ppt
PPTX
Core java complete ppt(note)
PPTX
React state
PDF
VueJS: The Simple Revolution
PPTX
Next.js vs React | what to choose for frontend development_
PPTX
Introduction to node.js
React Router: React Meetup XXL
How to go about testing in React?
TypeScript - An Introduction
Nodejs buffers
Express js
React hooks
NodeJS - Server Side JS
Basics of Model/View Qt programming
 
React workshop
JavaScript - Chapter 3 - Introduction
An introduction to React.js
NextJS - Online Summit for Frontend Developers September 2020
React JS - A quick introduction tutorial
Introducing type script
Asp.net mvc 5 ppt
Core java complete ppt(note)
React state
VueJS: The Simple Revolution
Next.js vs React | what to choose for frontend development_
Introduction to node.js
Ad

Similar to React native app with type script tutorial (20)

PDF
Евгений Жарков "React Native: Hurdle Race"
PDF
React Native: Hurdle Race
PDF
Connect.js - Exploring React.Native
PDF
JavaScript, TypeScipt and React Native
PDF
Mobile Open Day: React Native: Crossplatform fast dive
PDF
Introduction to React Native Workshop
PDF
React Native Workshop - React Alicante
PDF
An Emoji Introduction to React Native (Panagiotis Vourtsis, Senior Front End ...
PDF
React native: building native iOS apps with javascript
PPTX
20180518 QNAP Seminar - Introduction to React Native
PDF
React && React Native workshop
PDF
React native
PDF
Lessons from a year of building apps with React Native
PPTX
JS Fest 2018. Илья Иванов. Введение в React-Native
PDF
GITS Class #20: Building A Fast and Responsive UI in React Native
PDF
Nik Graf - Get started with Reason and ReasonReact
PPTX
Introduction to React Native
PDF
wcmc_practicals
PPTX
3. react - native: component
PDF
React Native - Short introduction
Евгений Жарков "React Native: Hurdle Race"
React Native: Hurdle Race
Connect.js - Exploring React.Native
JavaScript, TypeScipt and React Native
Mobile Open Day: React Native: Crossplatform fast dive
Introduction to React Native Workshop
React Native Workshop - React Alicante
An Emoji Introduction to React Native (Panagiotis Vourtsis, Senior Front End ...
React native: building native iOS apps with javascript
20180518 QNAP Seminar - Introduction to React Native
React && React Native workshop
React native
Lessons from a year of building apps with React Native
JS Fest 2018. Илья Иванов. Введение в React-Native
GITS Class #20: Building A Fast and Responsive UI in React Native
Nik Graf - Get started with Reason and ReasonReact
Introduction to React Native
wcmc_practicals
3. react - native: component
React Native - Short introduction
Ad

More from Katy Slemon (20)

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

Recently uploaded (20)

PDF
Machine learning based COVID-19 study performance prediction
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PDF
Approach and Philosophy of On baking technology
PDF
Modernizing your data center with Dell and AMD
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
Review of recent advances in non-invasive hemoglobin estimation
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PPTX
Cloud computing and distributed systems.
PDF
Encapsulation theory and applications.pdf
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PDF
Encapsulation_ Review paper, used for researhc scholars
PDF
Empathic Computing: Creating Shared Understanding
PDF
Unlocking AI with Model Context Protocol (MCP)
Machine learning based COVID-19 study performance prediction
Chapter 3 Spatial Domain Image Processing.pdf
“AI and Expert System Decision Support & Business Intelligence Systems”
Agricultural_Statistics_at_a_Glance_2022_0.pdf
Approach and Philosophy of On baking technology
Modernizing your data center with Dell and AMD
Understanding_Digital_Forensics_Presentation.pptx
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Mobile App Security Testing_ A Comprehensive Guide.pdf
Per capita expenditure prediction using model stacking based on satellite ima...
Review of recent advances in non-invasive hemoglobin estimation
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Cloud computing and distributed systems.
Encapsulation theory and applications.pdf
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
Encapsulation_ Review paper, used for researhc scholars
Empathic Computing: Creating Shared Understanding
Unlocking AI with Model Context Protocol (MCP)

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.