This is React-based typescript code that can be quickly generated.
๋น ๋ฅด๊ฒ ๋ฆฌ์กํธ ํ์ ์คํฌ๋ฆฝํธ ํ๊ฒฝ์ ๊ตฌ์ถํ ์ ์๋ ํ ํ๋ฆฟ์ ๋๋ค.
-
CSS in JS : styled-components๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐํธํ๊ฒ ์ปดํฌ๋ํธ ๋ณ๋ก ์คํ์ผ์ ์ ์ฉํ ์ ์์ต๋๋ค.
-
Hook: ์ํ๊ด๋ฆฌ๋ฅผ ํ๊ธฐ์ํด์ Context API ์ useReducer ์ ํจ๊ป ์ฌ์ฉํฉ๋๋ค.
-
Build:
yarn build
๋ฅผ ํตํด์ ์์ฑํ ์ฝ๋๋ค์ production mode๋ก ๋น๋ํ ์ ์์ต๋๋ค. ๋ณธ ํ ํ๋ฆฟ์์๋ ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ ๋น๋๊ฐ ์งํ๋ฉ๋๋ค.- Pre Build : ์์ฑํ ๋ชจ๋ testํ์ผ๋ค์ ์งํํฉ๋๋ค. ์ด ๋, ํต๊ณผํ์ง ๋ชปํ ํ์ผ์ด ์กด์ฌํ๋ฉด ๋น๋๊ณผ์ ์ด ์งํ๋์ง ์์ต๋๋ค.
- Build : Sourcemap ํ์ผ์ ์ ์ธํ ๋น๋๋ฅผ ์งํํฉ๋๋ค.
- Post Build : ๋ฐฐํฌ๋ฅผ ์ํด์ ๋น๋๋ ํ์ผ๋ค์ '์ฌ์ฉ์๊ฐ ์ง์ ํ ๊ฒฝ๋ก '๋ก ๋ณต์ฌ๋ฅผ ํ๊ฒ๋ฉ๋๋ค.
์ ๊ณผ์ ๋ฐ '์ฌ์ฉ์๊ฐ ์ง์ ํ ๊ฒฝ๋ก '๋ package.json
ํ์ผ์์ ์์ ํ ์ ์์ต๋๋ค.
yarn install // ํ์ ํจํค์ง๋ฅผ ์ค์นํฉ๋๋ค.
yarn start // HMR(Hot Module Replacement)์ด ๊ฐ๋ฅํ ๊ฐ๋ฐ ์๋ฒ๋ฅผ ์คํํฉ๋๋ค.(๊ธฐ๋ณธํฌํธ:3000)
yarn test // .test.js๋ก ๋๋๋ ํ์ผ์ ๋์์ผ๋ก ํ
์คํธ๋ฅผ ์งํํฉ๋๋ค.
yarn build // ์์ฑํ ์ฝ๋๋ฅผ ๋์์ผ๋ก ๋น๋๊ณผ์ ์ ์งํํฉ๋๋ค.
Simple-React-Ts-Template
โ
โ .env
โ .gitingnore
โ tsconfig.json
โ yarn.lock
โ package.json
โ
โโpublic
โ โ index.html
โ โ manifest.json
โ โ robots.txt
โ โโcss
โ โโfavicons
โ โโfonts
โ โโicons
โ โโimages
โ
โโ@types
โ index.d.ts
โ
โโsrc
โ App.tsx
โ index.tsx
โ serviceWorker.ts
โ setupTests.ts
โ react-app-env.d.ts
โ
โโcomponents
โ โโhome
โ โ
โ โโmodal
โ โโinfo
โ โโcommon
โ Snackbar.tsx
โ
โโcontainers
โ โโmodal
โ Index.tsx
โ info.tsx
โ โโcommon
โ Snackbar.tsx
โ
โโcontrollers
โ index.ts
โ fetch.ts
โ
โโlib
โ โโstyles
โ animations.ts
โ media.ts
โ palette.ts
โ styles.ts
โ zIndex.ts
โ โโutils
โ cookieUtil.ts
โ โโhooks
โ โโsvg
โ
โโmodules
โ โโactions
โ snackbar.ts
โ modal.ts
โ โโcontexts
โ snackbar.ts
โ modal.ts
โ โโstates
โ snackbar.ts
โ modal.ts
โ โโ__test__
โ modal.test.ts
โ snackbar.test.ts
โ index.tsx
โ
โโpages
โ HomePage.js
โ NotFound.js
โ
โโtypes
โโcontrollers
index.ts
โโmodules
snackbar.ts
modal.ts
-
Public: ์ ์ ์์๋ฅผ ์ ์ฅํ๋ ํด๋์ ๋๋ค. ๋ํ์ ์ผ๋ก .html, .css, robots.txt ์ธ์๋ ๊ฐ์ข Image ํ์ผ๋ค์ด ์กด์ฌํฉ๋๋ค.
-
package.json : ํด๋น ํ๋ก์ ํธ์ ์ด๋ฆ๊ณผ ๋ฒ์ ๋ฐ ํ๋ก์ ํธ ์ ๋ณด๋ค์ ์์ ๋ฐ ํ์ธํ ์ ์์ต๋๋ค. ๋ํ
PostBuild
๊ณผ์ ์์ ๋ฐฐํฌ ํด๋ ๊ฒฝ๋ก๋ฅผ ์์ ํ ์ ์์ต๋๋ค. (์๋ ์คํฌ๋ฆฝํธ ์ฐธ์กฐ)"postbuild": "cp -r build/* ../backend/src/client"
์ด ์ธ์๋ proxy๋ฅผ ์ค์ ํ์ฌ ๊ฐ๋ฐ์ ์งํํ ๋, ๊ฐ๋ฐ ์๋ฒ๋ฅผ ๋์์ API๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก
http://loclhost:5000
์ผ๋ก ์ค์ ๋์ด ์์ต๋๋ค."proxy": "http://localhost:5000"
-
tsconfig.json : ํด๋น ํ์ ์คํฌ๋ฆฝํธ ํ๋ก์ ํธ์์์ ์ปดํ์ผ ์ต์ ๋ฑ์ ์ค์ ํ ์ ์์ต๋๋ค. (ํ์ฌ ์ค์ ์ src๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋๊ฒฝ๋ก๊ฐ ์ค์ ๋์์ต๋๋ค. ์๋ ์คํฌ๋ฆฝํธ์ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค.)
import Component from 'components/path/Component' // or import Component from '../../components/path/Component'
3rd-party library ํ์ ์ ์ ์ธํ๋ ํด๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
"typeRoots": [ "./node_modules/@types", "./@types" ]
- ./@types : ํด๋น ํด๋์์ ์จ๋ํํฐ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ช ์ ํด๋๋ฅผ ๋ง๋ค๊ณ , index.d.ts๋ฅผ ์์ฑํฉ๋๋ค.
- ./@types/index.d.ts : ํด๋น ํ์ผ์์๋ ํ์ ์, ๋ด๋ถ ์์ ๊ฐ์ฒด์ ๋ํ ์ค๋ฐ๋ผ์ด๋ฉ์ ์ ์ํฉ๋๋ค. e.g. window ๊ฐ์ฒด์ ๋ํ ์ค๋ฒ๋ผ์ด๋ํ ์ธํฐํ์ด์ค Window
-
.env: ํด๋น ํ๋ก์ ํธ ์คํ์ ํ์ํ ํ๊ฒฝ๋ณ์๋ ํด๋น ํ์ผ์์ ์ถ๊ฐ ๋ฐ ์์ ํ ์ ์์ต๋๋ค. (๊ธฐ๋ณธ๊ฐ์ผ๋ก, HOST์ PORT๊ฐ ์์ฑ๋์ด ์์ด์ผ ํฉ๋๋ค.)
-
components : View๋ฅผ ๋ด๋นํ๋ ์ปดํฌ๋ํธ๋ค์ ์ ์ฅํ๋ ํด๋์ ๋๋ค.
-
containers : View์ Store๊ฐ์ Action์ ๋ด๋นํ๋ ์ปดํฌ๋ํธ๋ค์ ์ ์ฅํ๋ ํด๋์ ๋๋ค.
-
controllers : API๋ค์ ์ ์ฅํ๋ ํด๋์ ๋๋ค.
-
lib : ํ๋ก์ ํธ์ ํ์ํ ์ถ๊ฐ ๋ชจ๋๋ค์ ์ ์ฅํ๋ ํด๋์ ๋๋ค.
- styles : Component์์ ์ฌ์ฉํ๋ ๊ณตํต style์ ๋ํด์ ๋ชจ์๋ ํด๋์ ๋๋ค.
- utils : Component์์ ์ฌ์ฉํ๋ ๊ณตํต ๋ก์ง์ ๋ํด์ ๋ชจ์๋ ํด๋์ ๋๋ค.
- hooks : ์ปค์คํ ํ ์ ๋ชจ์๋ ํด๋์ ๋๋ค.
- svg : SVG ํ์์ ์์ด์ฝ์ ์ ์ฅํ๋ ํด๋์ ๋๋ค. (index.ts์์ svg๋ฅผ ์ปดํฌ๋ํธ๋ก ๋ง๋ค ์ ์์ต๋๋ค.)
-
modules : Reducer๋ค์ ์ ์ฅํ๋ ํด๋์ ๋๋ค.
-
pages : ๊ฐ ํ์ด์ง๋ฅผ ์ ์ฅํ๋ ํด๋์ ๋๋ค.
-
types : ํ๋ก์ ํธ์์ ๊ณตํต์ผ๋ก ์ฌ์ฉ๋๋ ํ์ ๋ค์ ์ ์ํฉ๋๋ค. (ํ์ ์, importํด์ ์ฌ์ฉ)
-
__ test __ : (test์ __ ์ฌ์ด์ ๊ณต๋ฐฑ์ ์์ต๋๋ค.) ๊ฐ ์ปดํฌ๋ํธ, ๋ชจ๋์ ํ ์คํธ ์ฝ๋๋ฅผ ์ ์ฅํ๋ ํด๋์ ๋๋ค.
๊ฐ๋ฐ ์๋๋ฅผ ํฅ์์ํค๊ธฐ ์ํด์ ํ์์ ์ด๋ผ ์๊ฐํ๋ ๊ธฐ๋ฅ ๋ฐ ํ์ผ๋ค์ด ์กด์ฌํฉ๋๋ค.
์ด์ ๋ ์ ์ฌ์ฉ๋์ง์๋ Internet Explorer ๋ธ๋ผ์ฐ์ ์ผ ๊ฒฝ์ฐ์๋ ๋ฆฌ๋ค์ด๋ ํธ ํ์ด์ง๊ฐ ํ์๋๋๋ก ๊ตฌํ๋์ด ์์ต๋๋ค. ๋ง์ฝ IE๋ฅผ ๋์์ผ๋ก ๊ตฌํํ๋ ํ๋ก์ ํธ์ผ ๊ฒฝ์ฐ index.html ํ์ผ์ ๋ค์ ์ฝ๋๋ฅผ ์ง์์ฃผ์๊ธธ ๋ฐ๋๋๋ค.
<!-- index.html -->
<script>
// Browsers not supported Redirect Page (IE)
const agent = navigator.userAgent.toLowerCase();
if ((navigator.appName === 'Netscape' && agent.indexOf('trident') !== -1) || (agent.indexOf("msie") !== -1)) {
window.location = "microsoft-edge://" + window.location.href;
}
</script>
์ฌ๋ฌ ๊ฐ์ contexts๋ฅผ ๊ฐ์ธ์ฃผ๊ธฐ ์ํด์, ๋ถํ์ํ ์ค์ฒฉ๊ตฌ์กฐ๋ณด๋ค๋, reduce๋ฅผ ์ด์ฉํ์ฌ, contexts๋ค์ ํ๋์ Provider๋ก ๋ฌถ์ด์ฃผ์์ต๋๋ค. ํ์ฌ modal ๋ฐ snackbar๋ฅผ ์ ์ธํ ์ถ๊ฐ contexts๋ฅผ ์์ฑ ์, ์๋ ํ์ผ์์ contexts๋ฅผ ์ถ๊ฐํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
// modules/index.tsx
import ModalProvider from 'modules/contexts/modal'
import SnackbarProvider from 'modules/contexts/snackbar'
/*
Combine Reducers
*/
const CombinedProvider = ({ contexts, children }) => contexts.reduce(
(Parent, Child) => <Parent>
<Child>{children}</Child>
</Parent>
);
/*
Create Provider
*/
const AppProvider = ({ children }) => {
return (
<CombinedProvider contexts={[
ModalProvider,
SnackbarProvider
]}>
{children}
</CombinedProvider>
);
}
export default AppProvider
๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ฌ์ด ์๋ํ๋ ํ์ผ์ด ํฌํจ๋์ด ์์ต๋๋ค. useReducer์ useContext๋ฅผ ์ด์ฉํ์ฌ ๋์ํฉ๋๋ค. (ํด๋น ๋ฐฉ์์ ์ ํ์ฌํญ ์ ๋๋ค.)
ํ์ผ์ containers/modal/info.js
์ด๋ฉฐ, ํด๋น ๋ชจ๋ฌ์ ๋ถ๋ฅด๊ณ ์ถ์ ์ปดํฌ๋ํธ์์ ํด๋น ํ์ผ์ importํ์ฌ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค. ๊ทธ ํ, modal action์ ์กด์ฌํ๋ pushModal
์ก์
์ ์ฌ์ฉํ์ฌ ๋ชจ๋ฌ์ ์๋์ํต๋๋ค. ๊ฐ ๋ชจ๋ฌ์ ๊ณ ์ ์ id๊ฐ์ ๋ฃ์ด์ ํธ์ถํด์ผ ํฉ๋๋ค. ๋ง์ฝ id๊ฐ์ด undefined๋ผ๋ฉด ํด๋น ๋ชจ๋ฌ์ ์ ์์ ์ผ๋ก ์๋ํ์ง ์์ ๊ฒ์
๋๋ค. ์๋๋ ๋ฆฌ๋์์ ์์ฑ๋ ์ก์
์
๋๋ค.
// modules/actions/modal
export const pushModal = (id: string, elem: React.ReactNode, args?: any) => ({ type: PUSH_MODAL, payload: { id, elem, args } });
export const popModal = () => ({ type: POP_MODAL });
export const deleteModal = (id: string) => ({ type: DELETE_MODAL, payload: id });
export const clearModal = () => ({ type: CLEAR_MODAL });
- pushModal : ๋ชจ๋ฌ์ ๋ฑ๋กํ๋ ํจ์์ ๋๋ค. ํด๋น ์ก์ ์ ํตํด์ ์ฌ๋ฌ๊ฐ์ ๋ชจ๋ฌ์ ์คํ์ฒ๋ผ ๋ฑ๋ก์ํฌ ์ ์์ผ๋ฉฐ, ์์๋ฅผ ์ ์งํ์ฑ๋ก ํ๋ฉด์ ํ์๋ฉ๋๋ค.
- popModal : ๋ฑ๋ก๋ ๋ชจ๋ฌ์์ ๊ฐ์ฅ ๋์ค์ ๋ฑ๋ก๋ ๋ชจ๋ฌ๋ถํฐ ์คํ์ฒ๋ผ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
- deleteModal : ๋ชจ๋ฌ๋ณ๋ก ๊ณ ์ ์ id๊ฐ์ ์ด์ฉํ์ฌ ํน์ ๋ชจ๋ฌ๋ง ์ ๊ฑฐํ ์ ์์ต๋๋ค.
- clearModal : ํ์ฌ ๋ฑ๋ก๋ ๋ชจ๋ ๋ชจ๋ฌ์ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
๋ชจ๋ฌ์ ํธ์ถํ๋ ๋ฐฉ์์ ์๋ ์์๋ฅผ ์ฐธ๊ณ ํ์ญ์์ค.
import { useContext } from 'react'
import styled from 'styled-components'
// containers
import InfoModal from 'containers/modal/Info'
// modules
import { modalContext } from 'modules/contexts/modal'
import { pushModal } from 'modules/actions/modal'
const Btn = () => {
const { dispatch: modalDispatch } = useContext(modalContext);
const modalOn = () => modalDispatch(
pushModal('INFO', InfoModal, {title: "Simple"})
);
return <Button onClick={modalOn}>Simple</Button>
}
const Button = styled.button`
...
`;
export default Btn
ํด๋น ๋ชจ๋ฌ ํ์ผ์์๋ PreventModalOff
์ ModalOff
๋ฐ args
์ธ์๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต๋ฉ๋๋ค. PreventModalOff
ํจ์๋ onMouseDown
์์ฑ์ผ๋ก ๋ชจ๋ฌ ์ต์์ ์์ฑ์ ๋ฑ๋กํด์ฃผ์๊ธธ ๋ฐ๋๋๋ค. ModalOff
๋ ์ ํ์ ์ฌํญ์
๋๋ค. args
๋ ๋ชจ๋ฌ์ ํธ์ถํ๋ ์ปดํฌ๋ํธ์์ ๋ชจ๋ฌ์๊ฒ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก Background์ MouseDown ์ด๋ฒคํธ๋ก ๋ชจ๋ฌ์ด ๋ซํ๋๋ก ์๋๋ฉ๋๋ค. ์ด ์ธ์ ๋ฒํผ์ ํตํด์ ๋ชจ๋ฌ์ ๋ซ๋ ๊ฒฝ์ฐ, ํด๋น ํจ์๋ฅผ ์ฌ์ฉํด์ฃผ์๊ธธ ๋ฐ๋๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ์์๊ฒ ๋ณด๋ค ๋์ Alert ํ์๋ฅผ ์ํด์ Snackbar ๊ตฌ์กฐ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ๋ณธ ์ค๋ต๋ฐ๋ useReducer์ useContext๋ฅผ ์ด์ฉํ์ฌ ๋์ํฉ๋๋ค. (ํด๋น ๋ฐฉ์์ ์ ํ์ฌํญ ์ ๋๋ค.)
๊ธฐ๋ณธ์ ์ผ๋ก ์ค๋ต๋ฐ ํ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. (Type : Default Color)
export type SnackbarType = 'INFO' |'SUCCESS' |'WARNING' |'ERROR';
- SUCCESS : Green Color
- WARNING : Red Color
- ERROR : Orange Color
- INFO : Gray Color
์ค๋ต๋ฐ๋ฅผ ํธ์ถํ๋ ๋ฐฉ์์ ์๋ ์์๋ฅผ ์ฐธ๊ณ ํ์ญ์์ค.
/* This file is Sample Component to call a snackbar. */
import { useContext } from 'react'
// components
import Button from 'components/path/Button'
// modules
import { snackbarContext } from 'modules/contexts/snackbar'
import { newSnackbar } from 'modules/actions/snackbar'
const Btn = () => {
const { dispatch: snackbarDispatch } = useContext(snackbarContext);
const callSnackbar = () => newSnackbar(snackbarDispatch, 'ํ
์คํธ ๋ฌธ๊ตฌ', 'INFO');
return <Button onClick={callSnackbar}>Snackbar</Button>
}
export default Btn
๊ธฐ๋ณธ์ ์ผ๋ก ๋น๋๊ธฐ ํต์ ์ ์ํด์ fetch API๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. ํด๋น ํ์ผ์์๋ CRUD๋ฅผ ๋ง์กฑํ๋ API๋ฅผ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ์์ฑ๋์์ต๋๋ค. (๋ณธ ํ์ผ ์ฌ์ฉ์ ๋ฌด๋ ์ ํ์ฌํญ์ ๋๋ค. ์ฌ์ฉํ์ง ์์ผ๋ฉด ์ง์์ฃผ์๊ธธ ๋ฐ๋๋๋ค.)
const Fetch = <T = any, U = object | FormData>(
url: string,
method: apiType.HttpMethod,
sendData?: U,
callback?: (res: apiType.FetchResultExtended<T>) => void,
failed?: (res: apiType.FetchResultExtended<T>) => void
): Promise<apiType.FetchResultExtended<T>> => { ... };
๊ธฐ๋ณธ์ ์ผ๋ก ํด๋น ๋ชจ๋์ ๋ค์๊ณผ ๊ฐ์ ์ธ์๋ฅผ ํ์๋ก ํฉ๋๋ค.
-
url: Target url์ ๋๋ค. ์์)
/board/1/post/3
-
method : ๊ธฐ๋ณธ์ ์ผ๋ก API๋ REST API ๋ฉ์๋๋ฅผ ์ค์ํ์ฌ ํ์ ์ ์ง์ ํ์์ต๋๋ค. ๋ง์ฝ ๋ค๋ฅธ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ, ํด๋น ํ์ ์ ์์ ํ ์ ์์ต๋๋ค.
POST
,GET
,DELETE
,PUT
,PATCH
๋ฑ์ด ์กด์ฌํฉ๋๋ค.// REST API Method type HttpMethod = 'POST' | 'GET' | 'PUT' | 'DELETE' | 'PATCH';
-
sendData : HTTP ์์ฒญ์ ํ ๋, ํ์ํ data์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก json/application์ผ๋ก ๋ณด๋ด์ง๋ฉฐ, sendData๋ JSONํ ๋์ด์ ํต์ ์ด ์งํ๋ฉ๋๋ค. FormData ํ์ ๋ ์ง์ํฉ๋๋ค.
-
callback : ํต์ ์ด ์๋ฃ๋ ํ์ ์คํ๋ ์ฝ๋ฐฑํจ์์ ๋๋ค. ์ ํ์ฌํญ์ ๋๋ค.
-
failed : 4xx ๋๋ 5xx ์๋ฌ(๋ํ์ ์ผ๋ก 404, 502)๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ, ์คํ๋ ํจ์์ ๋๋ค. ์ ํ์ฌํญ์ ๋๋ค.
headers๊ฐ์ Accept ์์ฑ์ 'application/json' ์ ์ ์ฉํ์ฌ, ์๋ฒ๋ก๋ถํฐ ๊ฐ API๋ณ json ๋ฉ์ธ์ง๋ฅผ ํ์ธํ ์ ์๋๋ก ํ์์ต๋๋ค. ๋ํ, server์ผ๋ก๋ถํฐ ๋ฐ๋ ๋ฐํ๊ฐ์ ๋ํ ๊ท์ฝ์ด ์กด์ฌํ ๊ฒฝ์ฐ FetchResultExtended
ํ์
์ ์๋์ ๊ฐ์ด ํ์ฅํ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ๊ฐ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
/**
* API Return Type (Origin)
*/
export interface FetchResult<T> {
verify: boolean;
message: string;
result: T;
}
/**
* API Return Type (Extended)
* - Add HTTP Status Code
*/
export interface FetchResultExtended<T> extends FetchResult<T> {
statusCode: number
};
๋น๋๊ธฐ ํต์ ์ผ๋ก ๋ฐ์ ๋ฐ์ดํฐ์ ํ์ ์ Fetch๋ฅผ ์คํํ ๋, ์ ์ํ ์ ์์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ด ์ ์๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
Fetch<{name: string, birth: number}>('/api/auth/user', 'GET')
Generic ํ์
์ ์ ์ ์ฌ๋ถ์ ์ฐจ์ด๋ ๋ค์๊ณผ ๊ฐ์ด ๋ฐํ๋ฐ์ ๋น๋๊ธฐ ๋ฐ์ดํฐ์ ๋ํด์ ํ์
์ถ๋ก ์ด ๊ฐ๋ฅํ๊ฒ ๋ฉ๋๋ค. ๋ง์ฝ ์ ์ธํ์ง ์๋๋ค๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก any
ํ์
์ผ๋ก ์ถ๋ก ๋ฉ๋๋ค.
ํด๋น ๋ชจ๋์ Promise ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค. ์๋์ ๊ฐ์ด ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
import Fetch from './fetch'
Promise.all([
Fetch('/api/first', 'POST', {'key': 'value'}),
Fetch('/api/second', 'POST', {'key': 'value'}),
Fetch('/api/third', 'POST', {'key': 'value'})
]);
// or (Using Promise .then/.catch)
Fetch('/api/first', 'GET')
.then(data => {
console.log(data);
})
.catch(err => {
console.log(err);
});
// or (Using Callback)
Fetch('/api/first', 'POST', {'key': 'value'},
(data) => {
console.log(data);
},
(err) => {
console.log(err);
});
Fetch('/api/first', 'POST', {'key': 'value'},
function(data) {
console.log(data);
},
function(err) {
console.log(err);
};
// Top-Level await ๋ฌธ๋ฒ์ Typescript 3.8 RC ๋ฒ์ ๋ถํฐ ์ฌ์ฉ๊ฐ๋ฅํฉ๋๋ค.
const response = await Fetch('/api/first', 'GET');
ํผ๋๋ฐฑ ๋ฐ ์ด์ ์ ๊ธฐ ๋ ์ธ์ ๋ ํ์์ ๋๋ค. ํ์ํ ๊ธฐ๋ฅ์ด๊ฑฐ๋ ๋ถํ์ํ ๊ธฐ๋ฅ์ด๋ผ๊ณ ์๊ฐ๋๋ค๋ฉด, ์ธ์ ๋ ์ง Issue๋ก ๋จ๊ฒจ์ฃผ์๊ธธ ๋ฐ๋๋๋ค!
'