타입스크립트

[주니어도 하는 타입스크립트] 리액트에서 타입스크립트로 코드 짜기 (feat. 제네릭)

보망고 2022. 2. 28. 16:18
반응형

리액트 실무자로서, 타입스크립트를 활용한 리액트 프로젝트는 어떻게 만드는지 궁금해졌다.

그래서 제네릭 기법을 활용한 간단한 타입스크립트 코드를 리액트에서 실행시켜보기로 했다.

 

제네릭 사용법은 앞에서 이미 숙지한 바 있으므로 아래 링크로 대체한다.

 

 

[주니어도 하는 타입스크립트] 제네릭이란 무엇이고 어떻게 쓰는것일까?

먼저 타입스크립트에서 예제를 통해 사용하는 일반적인 제네릭 사용법을 숙지해보자. type User = { id: number; name: string; gender: number; } function testUser(value: any): any { return value; } functio..

bomango.tistory.com

 

 

먼저 타입스크립트 코드 기반으로 리액트 프로젝트를 만드려고 한다면, 앱 실행부터 기존과는 다르다.

 

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

 

요렇게 타입스크립트를 추가 설치한 뒤 js로 설정된 파일을 tsx로 변경해줘야 한다. 그리고 서버를 한번 껐다 재 연결하면 좋다.

(하지만 본인은 요 과정에서 뭔가 코드가 꼬이면서 잘 작동하지 않아 그냥 처음부터 다시 실행하는 위의 방법을 썼다..)

 

참조: https://create-react-app.dev/docs/adding-typescript/

 

 

그러면 타입스크립트 기반의 리액트 프로젝트를 만들 준비가 완료됐다. 컴포넌트 파일 하나를 만들고 App.tsx에 화면에 보여지도록 컴포넌트를 불러오는 작업을 했다.

 

// App.tsx

import React from 'react';
import Greeting from './Greeting'

const App = () => {
  return <Greeting />
}

export default App;

 

App.tsx에 컴포넌트 Greeting을 불러온다.

 

 

// Greeting.tsx

import React, { FC } from "react";

interface GreetingsProps {
    name: string;
    gender: number;
}

const Greeting: FC<GreetingsProps> = ({ name, gender }) => (
    <div>Hello I'm {name}. I'm a {gender == 1 ? 'man' : 'woman'}.</div>
)

export default Greeting;

 

 

인터페이스 GreetingsProps에 'name'과 'gender' 값의 타입을 각각 지정해 줬고,

Greeting에 리턴값으로 div로 싼 텍스트를 작성했다. 이 텍스트에는 name과 gender값들이 props로 넘어와 리턴해주고 있다.

그렇다면 부모 영역App.tsx에서 props 값을 넘겨야할 차례.

 

 

// App.tsx

import React from 'react';
import Greeting from './Greeting'

const App = () => {
  return <Greeting name={"길동 홍"} gender={1} />
}

export default App;

각각 스트링과 넘버로 name, gender 값을 잘 넘겨주었다. 빨간줄 에러는 뜨지 않는다.

 

값이 잘 나오는걸 확인할 수 있다.

 

하지만 여러 블로그 글들을 읽다보니 react.FC를 사용하는걸 지양하는 게 좋다고들 한다.

react.FC를 사용하면 디폴트값으로 props에 children 값이 넘어오는데, 이를 사용할지 안할지 별도로 선언해줘야하는 불편함이 있고,

react.FC 사용시 defaultProps, propTypes, contextTypes 등이 디폴트값으로 넘어오는데, 만일 defaultProps를 초기 설정을 임의로 할 경우 에러가 발생한다.

때문에 이런 다양한 설정들을 활용할때 불편함을 겪게 된다는 것.

 

자세한 내용은 아래 링크 참조하면 좋다.

참조: https://velog.io/@velopert/create-typescript-react-component

 

 

그래서 react.FC를 빼고 코드를 다시 작성했다.

 

 

// App.tsx

import React from 'react';
import Greeting from './Greeting'

const App = () => {
  return <Greeting name={"길동 홍"} />
}

export default App;
// Greeting.tsx

import React from "react";

interface GreetingsProps {
    name: string;
    gender: number;
}

const Greeting = ({ name, gender }:GreetingsProps) => (
    <div>Hello I'm {name}. I'm a {gender == 1 ? 'man' : 'woman'}.</div>
)

Greeting.defaultProps = {
    gender: 1
}

export default Greeting;

 

 

매우 잘 작동하는 것을 확인했다.

작성하다보니 더 복잡한 코드도 타입스크립트로 짜보고 싶다는 욕심이 생긴다! 

반응형