리액트를 만든 페이스북에서 만든 플로우가 있지만 타입스크립트를 사용할 것인데,
npx create-react-app my-app
create-react-app
으로 생성한 리액트 프로젝트에 타입스크립트를 적용하기 위해서는 타입스크립트 라이브러리와 리액트의 타입이 정의된 타입 정의 파일을 설치할 필요가 있다.
타입 스크립트와 타입 정의 설치
npm install --save-dev typescript @types/node @types/react @types/react-dom @types/jest
{
"compilerOptions":{
"target": "es5",
"lib": [
"DOM",
"DOM.Iterable",
"ESNext"
],
"allowJs": true,
"skipLibCheck": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"strict": true,
"forceConsistentCasingInFileNames": true,
"noFallthroughCasesInSwitch": true,
"module": "esnext",
"moduleResolution": "node",
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "react-jsx"
},
"include": [
"src",
"custom.d.ts"
]
}
./src/App.js
👉 ./src/App.sx
./src/App.test.js
👉 ./src/App.test.tsx
./src/index.js
👉 ./src/index.tsx
./src/reportWebVitals.js
👉 ./src/reportWebVitals.ts
./src/setupTests.js
👉 ./src/setupTests.ts
.tsx
파일은 Typescript JSX 파일을 의미하고
.ts
파일은 Typescript Javascript 파일을 의미한다.
이렇게 타입스크립트를 사용함을 알리기 위해서는 파일확장자명을 변경해야 한다.
App.tsx
App.test.tsx
상단에 아래 코드를 추가import React from 'react';
reportWebVitals.tx
수정import { ReportHandler } from 'web-vitals';
const reportWebVitals = (onPerfEntry?: ReportHandler) => { ...
/src/custom.d.ts
파일을 생성하고 수정
d.ts
여기서 생성하는d.ts
파일은 타입 정의 파일로 타입스크립트가 인식하지 못하는 타입이나 타입스크립트 내에서 사용할 타입들을 정의할 때 사용한다.declare module '*.svg'{ import * as React from 'react'; export const ReactComponent : React.FunctionComponent<React. SVGProps< SVGSVGElement &{title?:string}>; const src: string; export default src; }
이렇게 설정이 끝났다면 App.test.tsx파일을 열서 앞서 작성했던 테스트 코드들을 복사해 붙여넣고 실행해본다.
npm run start
그런데... 문제가 있다고 한다.
이렇게 하면 너무 복잡하다는건데... 쉬운 방법이 있을까?
열받지만 마음을 가다듬고 쉽다고 하는 template이라는 옵션을 써보자
npx create-react-app my-app-typescript --template=typescript
엥? 바로 설치가 되어버렸다
그런데 App.test.tsx
파일을 복사해서 테스트하면 오류가 나는데 p 태그에서 나는 것을 알 수 있다.
...
expect(container.getElementsByTagName('p')[0]).toHaveTextContent(
'Edit src/App.tsx and save to reload.');
...
위와 같이 수정해주면 된다.,