TS 왜 쓰는가?
JavaScript
- Dynamic Typing으로 밑과 같은 경우에도 에러 발생 안함
ex) 1 + '2' = 3 가능- 런타임 에러 발생 가능
TypeScript
- type을 엄격히 검사하여 에러메시지를 정확히 짚어줌
ex) 1 + '2' = 에러 출력해줌- 런타임 에러 예방
런타임 전(코드를 실행하기 전)에 에러를 잡을 수 있음- 브라우저에서 자바스크립트로 변환됨
- 타입 추론, 타입 명시 가능
https://www.typescriptlang.org/
npx create-react-app my-app --template typescript
or
yarn create react-app my-app --template typescript
npm install --save typescript @types/node @types/react @types/react-dom @types/jest
or
yarn add typescript @types/node @types/react @types/react-dom @types/jest
tsconfig.json
생성npx typescript --init
나 tsc --init
해서 tsconfig.json
생성{
"compilerOptions": {
"target": "es6", //어떤버전의 js로 컴파일할지 정의
"lib": [ //어떤 환경에서 사용하는지 정의(api자동완성 제공해줌)
"dom", //브라우저
"dom.iterable",
"esnext"
],
"baseUrl": "./src", // 추가된 것 ./src를 절대 경로로 지정
"allowJs": true, //ts안에서 js허용(js파일 import가능)
"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의 모든파일 확인함
"src"
],
"exclude": [
"node_modules"
],
}
.jsx
나 .js
확장자 파일 => .tsx
로 확장자 변경
index.js => index.tsx 파일명,내용 변경
// 에러 메시지
react-dom.development.js:86 Warning: ReactDOM.render is
no longer supported in React 18. Use createRoot instead.
Until you switch to the new API, your app will behave as
if it's running React 17
// 구버전
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
ReactDOM.render(
<React.StrictMode>
<App />
</React.StrictMode>,
document.getElementById('root')
);
!
추가createRoot(container!) if you use TypeScript
문구에서createRoot(content!)
구조를 보고 !
추가import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
const root = ReactDOM.createRoot(document.getElementById('root')!);
root.render(
<React.StrictMode>
<App />
</React.StrictMode>
);
as HTMLElement
추가import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
const root = ReactDOM.createRoot(
document.getElementById("root") as HTMLElement
);
root.render(
<React.StrictMode>
<App />
</React.StrictMode>
);
import React from 'react';
import './App.css';
const App: React.FC = () => {
return (
<div className="App">
Hello Typescript
</div>
);
}
export default App;
styled-components, redux, react-router-dom과 같은 라이브러리를 사용했다면 밑과 같은 에러문이 뜨는데
npm install --dev @types/styled-components
npm install -D eslint
npx eslint --init
- How would you like to use ESLint?
- What type of modules does your project use?
- Which framework does your project use?
- Does your project use TypeScript? (y/N)
=> Y- Where does your code run? (Press space to select, a to toggle all, i to > invert selection)
What format do you want your config file to be in? (Use arrow keys)- The config that you've selected requires the following dependencies:
@typescript-eslint/eslint-plugin@latest @typescript-eslint/parser@latest
Would you like to install them now with npm? (Y/n)
=> Y
{
"env": {
"browser": true,
"es2021": true
},
"extends": [
"eslint:recommended",
"plugin:react/recommended",
"plugin:import/recommended",
"plugin:jsx-a11y/recommended",
"plugin:prettier/recommended"
],
"parserOptions": {
"ecmaFeatures": {
"jsx": true
},
"ecmaVersion": "latest",
"sourceType": "module"
},
"rules": {
"react/react-in-jsx-scope": 0,
"react/jsx-uses-react": 0
}
}
npm install -D eslint-plugin-import eslint-plugin-jsx-a11y eslint-plugin-react eslint-plugin-react-hooks eslint-plugin-prettier eslint-config-prettier
eslint-plugin-import : ES6의 import, export 구문을 지원, 필수 플러그인
eslint-plugin-react : React 규칙이 들어있는 플러그인
eslint-plugin-react-hooks : React Hooks 규칙이 들어있는 플러그인
eslint-plugin-jsx-a11y : JSX요소의 접근성 규칙에 대한 정적 검사 플러그인
root폴더에서 .prettierrc 생성
설정 옵션 참고 링크
변수명 : type명
const 변수명 :string = 'mun'
변수명 = 119; //타입이 변경되면 에러메시지 출력해줘서 버그 줄일수있음
|
로 여러타입 지정 가능let 변수명 :string | number = 'mun';
let 숫자 : string[] = ['one', 'two'];
let 나이 : {age : number} = {age : 1}
type
키워드로 변수처럼 사용 가능type nameType = string | number;
let 이름 : nameType = 'kim';
function 함수명(a :string) : string{
return '안녕';
}
//에러
function 함수명(x :number | string) {
return x * 2
}
//가능
function 함수명(x :number | string) {
if (typeof x === 'number'){
return x * 2
}
}
type Info = [number, boolean];
let mun:Info = [100, false]
type
키워드나 interface
키워드로 객체 타입 지정 가능속성명?
사용 가능interface UserInfo1 {
name : string,
age : number
}
type UserInfo2 = {
name? : string, //속성이 필수가 아니고 선택적일때 ? 사용
age : number
}
let 회원명 :UserInfo1 = {
name : 'mun',
age : 30
}
type UserInfo = {
[key :string] : number,
}
let 철수 :UserInfo = {
age : 30,
weight : 80,
}
/*확장*/
//People.tsx
export interface PeopleInterface {
name: string
age: number
}
interface StudentInterface extends PeopleInterface {
school: string
}
/*외부 컴포넌트 사용*/
import PeopleInterface from "People.tsx";
const cmp:React.FC=()=>{
const [people, setPeople]=useState<PeopleInterface>();
}
// 함수선언식
function Maker(name:string) : Player{
return {
name:name
}
}
// 함수표현식, 화살표함수
const Maker = (name:string): Player => ({name})
const nico = Maker("nico")
nico.age = 12
React와 React+TS 의 차이점
- React+TS : state, props, function, event 등에 타입 선언해줌
// 리액트
const [state, setState] = useState('초기값')
//✅ 리액트 + TS
const [state, setState] = useState<string>('초기값')
import React from 'react';
type GreetingsProps = {
name: string;
};
const Greetings: React.FC<GreetingsProps> = ({ name }) => (
<div>Hello, {name}</div>
);
export default Greetings;
import React from 'react';
type GreetingsProps = {
name: string;
mark: string;
option?: string;
};
function Greetings({ name, mark }: GreetingsProps) {
return (
<div>
Hello, {name} {mark}
</div>
);
}
Greetings.defaultProps = {
mark: '!'
};
export default Greetings;
https://github.com/typescript-cheatsheets/react
[React] create-react-app & Typescript 초기 세팅 완벽 정리
감사합니다!
초기 설정 어떻게 하나 찾아보다가 여기 보고 바로 됐어요 ㅎㅎ