Front/TypeScript

타입 종류 (TypeScript Types)

oodada 2024. 7. 18. 21:58

타입 종류 (TypeScript Types)

01. 타입 종류

- 문자

let str: string = '문자열'

let str: string;
let name: string = '김가을';
let hello: string = `안녕하세요. ${blue}님`;

- 숫자

let num: number = 123

let num: number; // undefined
num = 123; // 123
console.log(num);

let integer: number = 6;
let float: number = 3.14;
let hex: number = 0xf00d;
let infinity: number = Infinity;
let nan: number = NaN;

- 불리언

let bool: boolean = true

let bool: boolean;
let isTrue: boolean = true;
let isFalse: boolean = false;

- 배열

let arr: 배열타입[] = [값, 값, 값]

let arr: number[] = [1, 2, 3];
let animals: string[] = ['사자', '호랑이', '코끼리'];
let empty: never[] = []; // 빈 배열
let union: (string | number)[] = ['one', 2]; // 유니언 타입
let any: any[] = [1, 'two', true]; // any 타입

- 튜플 : 고정된 요소 수 만큼의 타입을 미리 선언 후 배열을 표현

let tuple: [타입, 타입, ...] = [값, 값, ...]

let tuple: [string, number] = ['one', 1];
let person: [string, number] = ['김겨울', 30];

- 객체

let obj: { key: 타입, key: 타입 } = { key: 값, key: 값 }

let obj: { name: string; age: number } = { name: '김겨울', age: 30 };
let person: { name: string; age: number; etc?: boolean } = { name: '김가을', age: 30, etc: true };
// ? : 선택적 프로퍼티
// etc?: boolean : etc 키는 있을 수도 있고 없을 수도 있음

- 객체 interface

  • 객체의 타입을 미리 정의하여 사용
  • 재사용성이 가능하고 가독성이 좋음

interface 인터페이스 { key: 타입, key: 타입 }

// interface 명명규칙 : 대문자로 시작
interface IPerson {
    name: string;
    age: number;
    etc?: boolean;
}

let userA: IPerson = { name: '김겨울', age: 3 };
let userB: IPerson = { name: '김가을', age: 2, etc: true };

- 함수 타입

let 함수명: (매개변수: 타입) => 반환타입 = (매개변수) => { ... }

const sum: (a: number, b: number) => number = (a, b) => {
    return a + b;
};

sum(1, 2); // 3
// void : 반환값이 없을 때 사용
const hello: (name: string) => void = name => {
    console.log(`Hello, ${name}!`);
};

hello('TypeScript'); // Hello, TypeScript!

06. React에서 ts 사용하기

타입스크립트를 사용하면 컴포넌트의 타입을 지정하여 개발할 수 있음

- 컴포넌트 생성

  • 컴포넌트를 생성할 때 타입을 지정하기 위해 React.FC<Props>를 사용

const 컴포넌트명: React.FC<Props> = ({ props }) => { ... }

문법

import React from 'react';

// Props 타입 정의
type Props = {
    name: string;
};

// 컴포넌트 정의
const 컴포넌트이름: React.FC<Props> = ({ name }) => {
    return <div>Hello, {name}!</div>;
};

export default Hello;

예시

// src/components/Hello.tsx
import React from 'react';

type HelloProps = {
    name: string;
};

const Hello: React.FC<HelloProps> = ({ name }) => {
    return <div>Hello, {name}!</div>;
};

export default Hello;

- useState 사용하기

const [state, setState] = useState<타입>(초기값)

// src/components/Counter.tsx
import React, { useState } from 'react';

const Counter: React.FC = () => {
    const [count, setCount] = useState<number>(0);

    return (
        <div>
            <p>{count}</p>
            <button onClick={() => setCount(count + 1)}>+1</button>
            <button onClick={() => setCount(count - 1)}>-1</button>
        </div>
    );
};

export default Counter;

- useReducer 사용하기

const [state, dispatch] = useReducer<Reducer<상태타입, 액션타입>>(reducer, 초기값)

// src/components/Counter.tsx
import React, { useReducer } from 'react';

type Action = { type: 'INCREASE' } | { type: 'DECREASE' };

function reducer(state: number, action: Action): number {
    switch (action.type) {
        case 'INCREASE':
            return state + 1;
        case 'DECREASE':
            return state - 1;
        default:
            throw new Error('Unhandled action');
    }
}

const Counter: React.FC = () => {
    const [count, dispatch] = useReducer(reducer, 0);

    return (
        <div>
            <p>{count}</p>
            <button onClick={() => dispatch({ type: 'INCREASE' })}>+1</button>
            <button onClick={() => dispatch({ type: 'DECREASE' })}>-1</button>
        </div>
    );
};

export default Counter;

- useContext 사용하기

const value = useContext<타입>(Context)

// src/components/Counter.tsx
import React, { useContext } from 'react';
import { CounterContext } from '../contexts/CounterContext';

const Counter: React.FC = () => {
    const { count, dispatch } = useContext(CounterContext);

    return (
        <div>
            <p>{count}</p>
            <button onClick={() => dispatch({ type: 'INCREASE' })}>+1</button>
            <button onClick={() => dispatch({ type: 'DECREASE' })}>-1</button>
        </div>
    );
};

export default Counter;

- useRef 사용하기

const ref = useRef<타입>(null)

// src/components/Counter.tsx
import React, { useRef } from 'react';

const Counter: React.FC = () => {
    const inputRef = useRef<HTMLInputElement>(null);

    return (
        <div>
            <input ref={inputRef} />
            <button onClick={() => inputRef.current?.focus()}>Focus</button>
        </div>
    );
};

export default Counter;

- interface 사용하기

import { 인터페이스 } from '파일경로'

// src/interfaces/index.ts
export interface HelloProps {
    name: string;
}
// src/components/Hello.tsx
import React from 'react';
import { HelloProps } from '../interfaces';

const Hello: React.FC<HelloProps> = ({ name }) => {
    return <div>Hello, {name}!</div>;
};

export default Hello;

- 타입스크립트로 리액트 컴포넌트 작성 시 주의사항

  • 컴포넌트의 props나 state를 정의할 때 interfacetype으로 정의
  • 컴포넌트의 props나 state를 정의할 때 React.FC를 사용하여 정의

'Front > TypeScript' 카테고리의 다른 글

타입 제너릭  (0) 2024.07.18
타입 별칭, this, 오버로딩, 클래스  (0) 2024.07.18
타입 인터페이스 (Interface)  (0) 2024.07.18
타입 추론, 할당, 단언, 가드  (0) 2024.07.18
타입 개요 및 개발환경 구성  (0) 2024.03.19
티스토리 친구하기