Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Appcomponent dat we deze component willen tonen. Dit doen we aan de hand van de <ComponentName/> syntax. Je merkt hier op dat we hier blijven werken met de HTML-achtige syntax. Het lijkt een beetje op een eigen HTML tag hebben aangemaakt. import React from 'react';
const List = () => {
return (
<div>{games.map((game: Game) => {
return <div key={game.id}>
<div>{game.name}</div>
<div>{game.releaseYear}</div>
<div>{game.sales}</div>
</div>
})}
</div>
);
}const App = () => {
return (
<div>
<h1>Welcome to the H2O Game shop</h1>
<List/>
</div>
);
}const Header = () => {
return (
<h1>Welcome to the H2O Game shop</h1>
);
}const App = () => {
return (
<div>
<Header/>
<List/>
</div>
);
}function Header() {
return (
<h1>Welcome to the H2O Game shop</h1>
);
}node --versionnpm --versionconst InputView = () => {
return (
<div>
<input type="text" id="name">
<input type="number" id="year" name="year" min="1900" max="2021"/>
<input type="button" id="submit" value="Add"/>
</div>
)
}const handleChange = (event) => {
console.log(event.target.value);
}const App = () => {
let games: Game[] = [
...
]
return (
...
);
}return (
<div>
<Header/>
<List games={games}/>
<InputView/>
</div>
);const InputView = () => {
const handleChange: ChangeEventHandler<HTMLInputElement> = (event) => {
console.log(event.target.value);
}
...
return (
<div>
<input type="text" id="name" onChange={handleChange} />
</div>
)
}// Opgepast: Deze code is FOUT! Doe dit nooit op deze manier
const InputView = () => {
let name = ""; // Dit is fout!
const handleChange: ChangeEventHandler<HTMLInputElement> = (event) => {
name = event.target.value; // Dit is fout!
}
return (
<div>
<input type="text" id="name" onChange={handleChange} />
<p>
The name you typed is {name}
</p>
</div>
)
}

const App = () => {
return (
<div>
<h1>Welcome to the H2O Game shop</h1>
<div>{games.map((game: string) => {
return <div key={game}>{game}</div>
})}</div>
</div>
);
}interface ListProps {
games: Game[]
}const List = (props : ListProps) => {
return (
<ul>{props.games.map((game: Game) => {
....
})}
</ul>
);
}const [name, setName] = useState<string>('');const App = () => {
return (
<div>
<h1>Welcome to the H2O Game shop</h1>
<div>{games.map((game: string) => {
return <div key={game}>{game}</div>
})}</div>
</div>
);
}interface Game {
id?: number
name: string,
releaseYear: number,
sales: number
}
let games: Game[] = [
{
id: 0,
name: "World of Warcraft",
releaseYear: 2004,
sales: 0
},
{
id: 1,
name: "Valheim",
releaseYear: 2021,
sales: 0
},
{
id: 2,
name: "Minecraft",
releaseYear: 2011,
sales: 0
}
]const App = () => {
return (
<div>
<h1>Welcome to the H2O Game shop</h1>
<div>{games.map((game: Game) => {
return <div key={game.id}>
<div>{game.name}</div>
<div>{game.releaseYear}</div>
<div>{game.sales}</div>
</div>
})}</div>
</div>
);
}const List = ({games} : ListProps) => {
return (
...
);
}const List = ({games} : {games: Game[]}) => {
...
}interface ListItemProps {
game: Game
}
const ListItem = ({ game }: ListItemProps) => {
return (
<div key={game.id}>
<div>{game.name}</div>
<div>{game.releaseYear}</div>
<div>{game.sales}</div>
</div>
)
}const List = ({ games }: ListProps) => {
return (
<ul>{games.map((game: Game) => {
return <ListItem game={game}/>
})}
</ul>
);
}const InputView = () => {
const [name, setName] = useState<string>('');
const handleChange: ChangeEventHandler<HTMLInputElement> = (event) => {
setName(event.target.value);
}
return (
<div>
<input type="text" id="name" onChange={handleChange} />
<p>
The name you typed is {name}
</p>
</div>
)
}const InputView = () => {
const [name, setName] = useState<string>('');
const [year, setYear] = useState<number>(1990);
const handleNameChange: ChangeEventHandler<HTMLInputElement> = (event) => {
setName(event.target.value);
}
const handleYearChange: ChangeEventHandler<HTMLInputElement> = (event) => {
setYear(parseInt(event.target.value));
}
const handleClick: MouseEventHandler<HTMLInputElement> = (event) => {
// does not do anything yet
}
return (
<div>
<input type="text" id="name" onChange={handleNameChange} value={name}/>
<input type="number" id="year" name="year" min="1990" max="2021" onChange={handleYearChange} value={year}/>
<input type="button" id="submit" onClick={handleClick} value="Add" />
<p>
You have typed {name} from the year {year}
</p>
</div>
)
}<input type="text" id="name" onChange={handleChange}/>
<input type="number" id="year" name="year" min="1990" max="2021" onChange={handleChange}/>const handleChange : ChangeEventHandler<HTMLInputElement> = (event) => {
console.log(event.target.value);
}const handleClick : MouseEventHandler<HTMLInputElement> = (event) => {
console.log("button clicked");
}const App = () => {
...
// A
const handleAdd = (game: Game) => {
console.log(game);
}
return (
<div>
<Header />
<List games={games} />
{/* // B */}
<InputView onAdd={handleAdd}/>
</div>
);
}npx --versionnpx create-react-app our-first-react-app --template typescriptnpm start "scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
}import React from 'react';
import logo from './logo.svg';
import './App.css';
function App() {
return (
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<p>
Edit <code>src/App.tsx</code> and save to reload.
</p>
<a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
</a>
</header>
</div>
);
}
export default App;const App = () => {
return {
...
}
}import React from 'react';
const App = () => {
return (
<div>
<h1>Hello World</h1>
</div>
);
}
export default App;import React from 'react';
const App = () => {
const title = "World";
return (
<div>
<h1>Hello World</h1>
</div>
);
}
export default App;import React from 'react';
const App = () => {
const title = "World";
return (
<div>
<h1>Hello {title}</h1>
</div>
);
}
export default App;<h1>Hello {title.toUpperCase()}</h1><h1>1+1 = {1+1}</h1>import React from 'react';
const getGreeting = () => {
return "Hello World";
}
const App = () => {
return (
<div>
<h1>{getGreeting()}</h1>
</div>
);
}
export default App;import './App.css';.container {
padding: 10px
}<div className="container">
<Header/>
<List games={games} />
<InputView onAdd={handleAdd} />
</div>import styles from './App.module.css'; <div className={styles.container}>
<Header />
<List games={games} />
<InputView onAdd={handleAdd} />
</div>// Header.tsx
import styles from "./Header.module.css"
const Header = () => {
return (
<h1 className={styles.header}>Welcome to the H2O Game shop</h1>
);
}
export default Header;/* Header.module.css */
.header {
font-size: 22pt;
border-bottom: 2px solid black;
text-transform: uppercase;
}// Inputview.tsx
...
import styles from "./InputView.module.css";
...
const InputView = ({onAdd} : InputViewProps) => {
...
return (
<div className={styles.inputView}>
...
</div>
)
}
export default InputView;/* Inputview.module.css */
.inputView {
margin: 10px;
display: flex;
flex-direction: column;
}
input {
width: 500px;
margin: 5px;
box-sizing: border-box;
}// List.tsx
...
import styles from './List.module.css'
...
const List = ({ games }: ListProps) => {
return (
<div className={styles.gamesList}>{games.map((game: Game) => {
return <ListItem game={game}/>
})}
</div>
);
}
export default List;// ListItem.tsx
...
import styles from './List.module.css'
...
const ListItem = ({ game }: ListItemProps) => {
return (
<div key={game.id} className={styles.gameCard}>
<div>{game.name}</div>
<div>{game.releaseYear}</div>
<div>{game.sales}</div>
</div>
)
}
export default ListItem;/* List.module.css */
.gamesList {
display: flex;
flex: row;
flex-wrap: wrap;
}
.gameCard {
border: 1px;
padding: 10px;
width: 200px;
box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2);
transition: 0.3s;
background-color: white;
border-radius: 5px; /* 5px rounded corners */
margin: 10px
}const Header = () => {
return (
<h1 style={{fontSize: '22pt', borderBottom: '2px solid black', textTransform: 'uppercase'}}>Welcome to the H2O Game shop</h1>
);
}import { CSSProperties } from 'react';
const headerStyle : CSSProperties = {
fontSize: '22pt', borderBottom: '2px solid black', textTransform: 'uppercase'
}
const Header = () => {
return (
<h1 style={headerStyle}>Welcome to the H2O Game shop</h1>
);
}
export default Header;npm install styled-components
npm install @types/styled-componentsimport styled from 'styled-components'import styled from 'styled-components'
const TitleHeader = styled.div`
font-size: 22pt;
border-bottom: 2px solid black;
text-transform: uppercase;
`;
const Header = () => {
return (
<TitleHeader>Welcome to the H2O Game shop</TitleHeader>
);
}
export default Header;import styled, { keyframes } from 'styled-components'
const fadeIn = keyframes`
0% {
opacity: 0;
}
100% {
opacity: 1;
}
`;
const TitleHeader = styled.div`
font-size: 22pt;
border-bottom: 2px solid black;
text-transform: uppercase;
animation: 1s ${fadeIn} ease-out;
`;
const Header = () => {
return (
<TitleHeader>Welcome to the H2O Game shop</TitleHeader>
);
}
export default Header;- src
--- App.tsx
--- Header.tsx
--- InputView.tsx
--- List.tsx
--- ListItem.tsx
--- types.tsimport React from "react";
import ListItem from "./ListItem";
import { Game } from "./types";
interface ListProps {
games: Game[]
}
const List = ({ games }: ListProps) => {
return (
<ul>{games.map((game: Game) => {
return <ListItem game={game}/>
})}
</ul>
);
}
export default List;import ListItem from "./ListItem";export interface Game {
id?: number
name: string,
releaseYear: number,
sales: number
}import { Game } from './types.ts'- src/
-- components
--- App.tsx
--- App.test.tsx
--- App.css
--- List.tsx
--- List.test.tsx
--- List.css
...- src/
-- components
--- App
---- App.tsx
---- App.test.tsx
---- App.css
--- List
---- List.tsx
---- List.test.tsx
---- List.css
...- src/
-- components
--- App/
--- List/- src/
-- components
--- App
---- App.tsx
---- App.test.tsx
---- App.css
---- utils.ts
--- List
---- List.tsx
---- List.test.tsx
---- List.css
---- hooks.ts- src/
-- components
--- App
---- App.tsx
---- App.test.tsx
---- App.css
--- List
---- List.tsx
---- List.test.tsx
---- List.css
---- ListItem.tsximport InputView from '../InputView/InputView';
import List from '../List/List';
import { Game } from '../../types';"baseUrl": "src"const App = () => {
...
<ListPage games={games} handleAdd={handleAdd} theme={'light'}/>
....
}interface ListPageProps {
games: Game[],
handleAdd: (game: Game) => void,
theme: string
}
const ListPage = ({games,handleAdd, theme} : ListPageProps) => {
return (
<div>
<List games={games} theme={theme}/>
<InputView onAdd={handleAdd} theme={theme} />
</div>
);
}interface ListProps {
games: Game[],
theme: string
}
const List = ({ games, theme }: ListProps) => {
return (
<div className={styles.gamesList}>{games.map((game: Game) => {
return <ListItem game={game} theme={theme}/>
})}
</div>
);
}interface ListItemProps {
game: Game,
theme: string,
}
const ListItem = ({ game, theme }: ListItemProps) => {
...
}
interface InputViewProps {
onAdd: (game: Game) => void
}





const handleNameChange: ChangeEventHandler<HTMLInputElement> = (event) => {
setName(event.target.value);
localStorage.setItem('name', name);
}const [name, setName] = useState<string>(localStorage.getItem('name') ?? ''); useEffect(() => {
localStorage.setItem('name', name);
},[name]);useEffect(() => {
document.title = 'Games Store'
},[]);export const ThemeContext = React.createContext({mode: 'light'});return (
<ThemeContext.Provider value={{mode: 'light'}}>
<Router>
...
</Router>
</ThemeContext.Provider>import { ThemeContext } from 'components/App/App';
import { useContext } from 'react';
import { Link } from 'react-router-dom';
import { Game } from 'types';
import styles from './List.module.css'
interface ListItemProps {
game: Game
}
const ListItem = ({ game }: ListItemProps) => {
const {mode} = useContext(ThemeContext);
return (
<Link to={`/detail/${game.id}`}>
<div key={game.id} className={`${styles.gameCard} ${mode === 'dark' ? styles.gameCardDark : ''}`}>
<div>{game.name}</div>
<div>{game.releaseYear}</div>
<div>{game.sales}</div>
</div>
</Link>
)
}
export default ListItem;export const ThemeContext = React.createContext({mode: 'light', setMode: (mode: string) => {}});const [mode, setMode] = useState('light');<ThemeContext.Provider value={{mode: mode, setMode: setMode}}>npm install --save @fortawesome/fontawesome-svg-core
npm install --save @fortawesome/free-solid-svg-icons
npm install --save @fortawesome/react-fontawesomeimport React, { useContext } from 'react';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { faMoon, faSun } from '@fortawesome/free-solid-svg-icons'
import { ThemeContext } from 'components/App/App';
import styles from './ModeButton.module.css'
const ModeButton = () => {
const {mode, setMode} = useContext(ThemeContext);
return (
<div className={styles.modeToggle}>
{mode === 'dark' ?
<button onClick={() => {setMode('light')}}><FontAwesomeIcon icon={faSun} className={styles.modeIcon}/></button> :
<button onClick={() => {setMode('dark')}}><FontAwesomeIcon icon={faMoon} className={styles.modeIcon}/></button>
}
</div>
)
}
export default ModeButton;
.modeToggle {
display: flex;
align-items: center;
margin-left: auto;
padding-right: 20px;
}
.modeToggle button {
background-color: transparent;
border: none;
}
.modeIcon {
color: white
}
.modeIcon:hover {
color: lightblue
}const InputView = ({onAdd} : InputViewProps) => {
...
}const handleClick: MouseEventHandler<HTMLInputElement> = (event) => {
onAdd({
name: name,
releaseYear: year,
sales: 0
})
}const [games, setGames] = useState<Game[]>([
{
id: 0,
name: "World of Warcraft",
releaseYear: 2004,
sales: 0
},
{
id: 1,
name: "Valheim",
releaseYear: 2021,
sales: 0
},
{
id: 2,
name: "Minecraft",
releaseYear: 2011,
sales: 0
}
]);const handleAdd = (game: Game) => {
games.push(game); // FOUT!
}const handleAdd = (game: Game) => {
setGames([...games, game])
}const handleAdd = (game: Game) => {
let max = Math.max(...games.map((g) => g.id!),0) + 1;
game.id = max;
setGames([...games, game])
}interface ListPageProps {
games: Game[],
handleAdd: (game: Game) => void
}import InputView from 'components/InputView/InputView';
import List from 'components/List/List';
import React from 'react';
import { Game } from 'types';
import styles from './ListPage.module.css';
interface ListPageProps {
games: Game[],
handleAdd: (game: Game) => void
}
const ListPage = ({games,handleAdd} : ListPageProps) => {
return (
<div>
<List games={games} />
<InputView onAdd={handleAdd} />
</div>
);
}
export default ListPage;import ListPage from 'pages/ListPage/ListPage';
import Header from 'components/Header/Header';
import React, { useState } from 'react';
import { Game } from 'types';
import styles from './App.module.css';
const App = () => {
const [games, setGames] = useState<Game[]>([
...
]);
const handleAdd = (game: Game) => {
let max = Math.max(...games.map((g) => g.id!),0) + 1;
game.id = max;
setGames([...games, game])
}
return (
<div>
<Header />
<div className={styles.container}>
<ListPage games={games} handleAdd={handleAdd}/>
</div>
</div>
);
}
export default App;npm install --save react-router-dom@5
npm install --save-dev @types/react-router-dom@5import styles from './HomePage.module.css';
const HomePage = () => {
return <p className={styles.welcomeText}>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. In hendrerit mi nec elit congue, et fringilla tellus pharetra. Cras commodo, est quis hendrerit porta, ligula arcu egestas arcu, vitae volutpat ex libero tristique augue. Sed pellentesque urna nec eros pellentesque, quis interdum tellus convallis. Cras maximus fringilla magna, a viverra nulla malesuada eget. Integer erat eros, eleifend a pulvinar sed, aliquam sit amet quam. Pellentesque bibendum tortor eget faucibus varius. Nunc dictum est enim, ac suscipit quam ultricies mattis. Sed ut quam in elit rhoncus accumsan eget sed nibh. Donec tincidunt, nulla quis viverra mattis, quam arcu posuere sapien, sit amet luctus magna nisl quis nisl. Nulla scelerisque dapibus interdum. Nulla ultrices non erat vitae consequat. Donec sit amet est quis tellus auctor rutrum ut vel felis. Cras egestas euismod vestibulum. Ut aliquam porttitor nisi, in gravida justo interdum quis. Vivamus quis lectus ac metus sollicitudin vulputate in nec diam. Proin vel cursus nunc.
</p>
}
export default HomePage;import ListPage from 'pages/ListPage/ListPage';
import React, { useState } from 'react';
import { Game } from 'types';
import styles from './App.module.css';
import {
BrowserRouter as Router,
Switch,
Route,
Link
} from "react-router-dom";
import HomePage from 'pages/HomePage/HomePage';
import Header from 'components/Header/Header';
const App = () => {
...
return (
<Router>
<div>
<Header />
<div className={styles.container}>
<Switch>
<Route path="/list">
<ListPage games={games} handleAdd={handleAdd} />
</Route>
<Route path="/" exact>
<HomePage />
</Route>
</Switch>
</div>
</div>
</Router>
);
}
export default App;
<Link to="/">Home</Link>
// <a href="/">Home</a>import React from "react";
import { NavLink } from "react-router-dom";
import styles from "./Header.module.css"
const Header = () => {
return (
<div className={styles.header}>
<div className={styles.headerName}>H2O Store</div>
<ul>
<li><NavLink exact to="/" activeClassName={styles.activeLink}>Home</NavLink></li>
<li><NavLink exact to="/list" activeClassName={styles.activeLink}>Games</NavLink></li>
</ul>
</div>
);
}
export default Header;.header {
background-color: #333;
font-size: 12pt;
flex-direction: row;
display: flex;
}
.headerName {
display: block;
color: white;
text-align: center;
padding: 14px 16px;
text-decoration: none;
}
.activeLink {
font-weight: bolder;
}
ul {
list-style-type: none;
margin: 0;
padding: 0;
overflow: hidden;
}
li {
float: left;
}
li a {
display: block;
color: white;
text-align: center;
padding: 14px 16px;
text-decoration: none;
}
li a:hover {
background-color: #111;
}import styles from './DetailPage.module.css';
interface DetailPageProps {
games: Game[]
}
const DetailPage = ({games} : DetailPageProps) => {
return (
<div>Detail Page</div>
)
}
export default DetailPage;<Switch>
<Route path="/list">
<ListPage games={games} handleAdd={handleAdd} />
</Route>
<Route path="/" exact>
<HomePage />
</Route>
<Route path="/detail/:id">
<DetailPage games={games}/>
</Route>
</Switch>import { useParams } from 'react-router-dom';
import { Game } from 'types';
import styles from './DetailPage.module.css';
interface ParamTypes {
id: string
}
interface DetailPageProps {
games: Game[]
}
const DetailPage = ({games} : DetailPageProps) => {
let { id } = useParams<ParamTypes>();
let game = games.find((game: Game) => game.id === parseInt(id));
return (
<div>
<div>{game?.name}</div>
<div>{game?.releaseYear}</div>
<div>{game?.sales}</div>
</div>
)
}
export default DetailPage;const ListItem = ({ game }: ListItemProps) => {
return (
<Link to={`/detail/${game.id}`}>
<div key={game.id} className={styles.gameCard}>
<div>{game.name}</div>
<div>{game.releaseYear}</div>
<div>{game.sales}</div>
</div>
</Link>
)
}const [games, setGames] = useState<Game[]>([]);useEffect(() => {
setTimeout(() => {
setGames([
{
id: 0,
name: "World of Warcraft",
releaseYear: 2004,
sales: 0
},
{
id: 1,
name: "Valheim",
releaseYear: 2021,
sales: 0
},
{
id: 2,
name: "Minecraft",
releaseYear: 2011,
sales: 0
}
]);
},1000);
},[])const [updating, setUpdating] = useState(true);
useEffect(() => {
setUpdating(true);
setTimeout(() => {
setGames([
{
id: 0,
name: "World of Warcraft",
releaseYear: 2004,
sales: 0
},
{
id: 1,
name: "Valheim",
releaseYear: 2021,
sales: 0
},
{
id: 2,
name: "Minecraft",
releaseYear: 2011,
sales: 0
}
]);
setUpdating(false);
},1000);
},[])return (
<Router>
<div>
<Header />
{updating ? <div className={styles.container}>Loading data</div> :
<div className={styles.container}>
<Switch>
<Route path="/list">
<ListPage games={games} handleAdd={handleAdd} />
</Route>
<Route path="/detail/:id">
<DetailPage games={games} />
</Route>
<Route path="/" exact>
<HomePage />
</Route>
</Switch>
</div>}
</div>
</Router>
);{updating ? <div className={styles.loaderContainer}><div className={styles.loader}></div></div> :.loaderContainer {
display: flex;
align-items: center;
height: 100vh;
justify-content: center;
}
.loader {
border: 4px solid #f3f3f3; /* Light grey */
border-top: 4px solid #3498db; /* Blue */
border-radius: 50%;
width: 64px;
height: 64px;
animation: spin 2s linear infinite;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}const getGames = async () => {
setUpdating(true);
let response = await fetch('http://localhost:3001/games',{
method: 'GET', // *GET, POST, PUT, DELETE, etc.
});
let json = await response.json();
setGames(json as Game[]);
setUpdating(false);
}useEffect(() => {
getGames();
},[]);const handleAdd = async (game: Game) => {
setUpdating(true);
let response = await fetch('http://localhost:3001/games',{
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(game)
});
let json = await response.json();
setGames(json as Game[]);
setUpdating(false);
}nodeexpresstsc --init{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"allowJs": true,
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true
}
}npm install --save express cors
npm install --save-dev @types/node @types/expressimport { Request, Response } from 'express';
import express from 'express';
const app = express(); // A
var cors = require('cors') // B
app.use(cors()) // B
app.use(express.json()); // C
app.use(express.urlencoded({ extended: true })); // C
app.listen(3001, async() => { // D
console.log('The application is listening on port 3001!');
})
export {};var cors = require('cors');
app.use(cors());[
{
"id": 0,
"name": "World of Warcraft",
"releaseYear": 2004,
"sales": 0
},
{
"id": 1,
"name": "Valheim",
"releaseYear": 2021,
"sales": 0
},
{
"id": 2,
"name": "Minecraft",
"releaseYear": 2011,
"sales": 0
}
]import { promises as fs } from 'fs';
import { Game } from '../types';
...
app.listen(3001, async() => {
games = JSON.parse(await fs.readFile('games.json', 'utf8')) as Game[];
console.log('The application is listening on port 3001!');
});let games: Game[] = [];app.get('/games', (req:Request, res:Response) => {
res.json(games);
});app.get('/games/:id', (req:Request, res:Response) => {
let id = parseInt(req.params.id);
let game = games.find((g: Game) => g.id === id);
if (game !== undefined) {
res.json(game);
} else {
res.status(404).json();
}
});app.post('/games', (req:Request, res:Response) => {
let newId : number = Math.max(...games.map((g: Game) => g.id!)) + 1;
let game : Game = req.body as Game;
game.id = newId;
games.push(game);
res.json(games);
});app.put('/games/:id', (req: Request, res: Response) => {
let id = parseInt(req.params.id);
let game : Game = req.body as Game;
games = games.map((g: Game) => (g.id === id) ? { ...g, ...game } : g);
res.json(games);
});for (let i=0;i<games.length;i++) {
if (games[i].id === id) {
games[i] = {...games[i], ...game}
}
}app.post('/games/:id/sell', (req: Request, res: Response) => {
let id = parseInt(req.params.id);
games = games.map((g: Game) => (g.id === id) ? { ...g, sales: g.sales+1 } : g);
res.json(games);
});ts-node index.ts










