기본 타입

  • 문자열
let text: string = 'text';
text = 3; // error
  • 숫자
let num: number = 1;
num = 'text'; // error
  • 불리언
let isBoolean: boolean = true;
isBoolean = 'boolean'; // error
  • null
let empty: null = null;
empty = 'null'; // error
  • undefined
let errors: undefined = undefined;
errors = 'undefined'; // error


배열

const stringArr: string[] = ['text1', 'text2'];
const numberArr: number[] = [1, 2];

stringArr.push(3);  // error

또는 아래와 같이 지정할 수 있다.

const stringArr: Array<string> = ['text1', 'text2'];
const numberArr: Array<number> = [1, 2];


튜플

배열 내 값을 여러 타입으로 지정할 수 있다.

const arr: [string, number] = ['text', 1];

arr[0] = 2; // error
arr[1].toUpperCase(); // error

순서를 지켜야 하므로 0번 인덱스의 값에는 string 을 제외한 다른 값이 들어갈 수 없고, 1번 인덱스의 값에는 number 를 제외한 다른 타입의 메서드를 사용할 수 없다.


함수 (return 값)

return 값에 따라 함수의 타입을 지정한다.


  • return 되는 값이 없을 때
function noReturn(): void {
  console.log('no return');
}


  • return 되는 값이 있을 때
function returnNumber(): number {
  return 1;
}


  • never

절대 발생될 수 없는 타입을 나타낼 때 사용한다.

에러객체를 반환하거나, 무한루프 함수에서 return 타입을 never 로 지정한다.

function returnErr(): never {
  throw new Error();
}


function returnErr(): never {
  throw new Error();
}


interface

내용이 복잡해지는 객체는 interface 로 타입을 지정한다.

interface TypeUser = {
  name: string,
  isFemale: boolean,
}

const user: TypeUser = {
  name: 'Yujoo',
  isFemale: true,
}

interface 에서 타입을 지정한 key 는 모두 값을 가져야하며, 값이 할당되지 않으면 에러를 반환한다.

만약 해당 값이 없을 수도 있다면 아래와 같이 ?: 으로 지정해야 한다.

interface TypeUser = {
  name: string,
  isFemale?: boolean, // boolean or undefined
}

const user: TypeUser = {
  name: 'Yujoo',
}


type

타입을 미리 선언해두고 사용할 수 있다.

type TypeScore = 'A' | 'B' | 'C' | 'D';

interface TypeUser = {
  name: string,
  score: TypeScore,
}

const user: TypeUser = {
  name: 'Yujoo',
  score: 'E', // error
}

위 코드는 user.score 에 type 으로 지정되지 않은 값이 입력되어 에러를 반환한다.


파라미터

일반적인 변수와는 다르게 파라미터는 타입 지정이 필수이다.

const add = (num1: number, num2: number): number => {
  return num1 + num2;
}


코드의 가독성을 위해 아래와 같이 interface 로 지정해 사용할 수도 있다.

interface TypeCalc {
  (num1: number, num2: number2): number;
}

const add: TypeCalc = (num1, num2) => {
  return num1 + num2;
}


class

class 내부의 상단에서 변수에 대한 타입을 지정한다.

class CalCulator {
  num1: number;
  num2: number;

  constructor(num1: number, num2: number) {
    this.num1 = num1;
    this.num2 = num2;
  }

  plus(): number {
    return this.num1 + this.num2;
  }
}

메서드나 변수가 늘어나면 가독성이 떨어지므로 interface 를 사용하는 편이 좋다.

class 에 타입 지정은 implements 로 지정해야 한다.

interface TypeCalc {
  num1: number;
  num2: number;
  plus(): number;
}

class CalCulator implements TypeCalc {
  constructor(num1: number, num2: number) {
    this.num1 = num1;
    this.num2 = num2;
  }

  plus() {
    return this.num1 + this.num2;
  }
}


함수 세부 타입 지정

파라미터로 넘어오는 값이 없을수도 있다면 ? 로 옵셔널 파라미터 처리를 한다.

function func(name?: string): string {
  return `Hello, ${name || 'anonymous'}!`;
}

const result = hello('Yujoo');
console.log(result);


그러나 파라미터가 복수개가 된다면 첫번째 파라미터는 옵셔널로 지정할 수 없다.

첫번째 파라미터는 필수적으로 입력되어야 한다.