React에서 TypeScript를 적용하고 사용 방법에 대해 알아보겠습니다.
설치
create-react-app
명령어에 typescript 옵션을 추가합니다.
1
| $ npx create-react-app typescript --template typescript
|
Typescript를 추가하지 않은 기존 프로젝트가 있다면 다음 명령어를 실행하여 설치합니다.
1
| $ npm install --save typescript @types/node @types/react @types/react-dom @types/jest
|
Typescript 사용 시 styled-components 부분에서 에러가 날 경우 다음 명령어를 실행하여 설치합니다.
1
| $ npm i --save-dev @types/styled-components
|
Typing the Props
Prop Types는 코드를 실행한 후 에만 브라우저의 콘솔에 경고 표시로 확인이 가능합니다.
TypeScript를 사용하는 이유는 코드가 실행되기 전에 오류를 확인하기 위해서입니다.
interface
는 일반적으로 타입 체크를 위해 사용되며 변수, 함수, 클래스에 사용할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12
| import Circle from './Circle';
function App() { return ( <div> <Circle bgColor="teal" /> <Circle bgColor="tomato" /> </div> ); }
export default App;
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| import styled from 'styled-components';
interface CircleProps { bgColor: string; }
const Container = styled.div<CircleProps>` width: 200px; height: 200px; border-radius: 100px; background-color: ${(props) => props.bgColor}; `;
function Circle({ bgColor }: CircleProps) { return <Container bgColor={bgColor} />; }
export default Circle;
|
Optional Props
props는 기본으로 required 이지만 interface
의 object 뒤에 ?
를 추가하여 optional 될 수 있도록 변경 가능합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| import styled from 'styled-components';
interface ContainerProps { bgColor: string; borderColor: string; }
const Container = styled.div<ContainerProps>` width: 200px; height: 200px; border-radius: 100px; background-color: ${(props) => props.bgColor}; border: 1px solid ${(props) => props.borderColor}; `;
interface CircleProps { bgColor: string; borderColor?: string; text?: string; }
function Circle({ bgColor, borderColor, text = 'default text' }: CircleProps) { return ( <Container bgColor={bgColor} borderColor={borderColor ?? 'white'}> {text} </Container> ); }
export default Circle;
|
State
State 사용 시 number, string 타입을 같이 쓰고 싶다면 다음과 같이 정의합니다.
1 2 3 4
| const [value, setValue] = useState<number | string>(0); setValue(1); setValue('hello'); setValue(true);
|
Event
SyntheticEvent는 기본적으로 ReactJS 버전의 이벤트입니다. 이벤트들의 정보를 확인하는 사이트입니다.
React.FormEvent<HTMLInputElement>
또는 React.FormEvent<HTMLFormElement>
와 같은 Element를 사용함으로써 event를 보호하고 어떤 event 를 받는지 알 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| import React, { useState } from 'react';
function App() { const [value, setValue] = useState(''); const onChange = (event: React.FormEvent<HTMLInputElement>) => { const { currentTarget: { value }, } = event; setValue(value); }; const onSubmit = (event: React.FormEvent<HTMLFormElement>) => { event.preventDefault(); console.log(value); }; return ( <div> <form onSubmit={onSubmit}> <input value={value} onChange={onChange} type="text" placeholder="username" /> <button>Log in</button> </form> </div> ); }
export default App;
|
Theme
styled.d.ts 파일을 생성합니다.
1 2 3 4 5 6 7 8 9 10
| import 'styled-components';
declare module 'styled-components' { export interface DefaultTheme { textColor: string; bgColor: string; btnColor: string; } }
|
thmem.ts 파일을 생성하고 테마를 정의합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| import { DefaultTheme } from 'styled-components';
export const lightTheme: DefaultTheme = { bgColor: 'white', textColor: 'black', btnColor: 'tomato', };
export const darkTheme: DefaultTheme = { bgColor: 'black', textColor: 'white', btnColor: 'teal', };
|
React에서 테마 사용하는 것과 똑같은 방식입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| import React from 'react'; import ReactDOM from 'react-dom'; import { ThemeProvider } from 'styled-components'; import App from './App'; import { lightTheme } from './theme';
ReactDOM.render( <React.StrictMode> <ThemeProvider theme={lightTheme}> <App /> </ThemeProvider> </React.StrictMode>, document.getElementById('root') );
|
참고