TypeScript : 시작하기

김가영·2021년 6월 21일
0

JavaScript

목록 보기
5/9

Typescript 복습을 시작했다.
Typescript Documentation을 참고하였다.

시작하기는 Typescript For Javascript Programmers 항목을 참고하였다.

Typescript는 기본적으로 Javascript에 타입 시스템을 제공한다. 자바스크립트에서도 string이나 number와 같은 타입이 존재하기는 하지만, 자바스크립트에서는 실제로 타입이 올바로 쓰였는지(오류를 발생시키지 않는지)에 대한 확인을 하지는 않는다.

예를 들어,

let str = 'string';
str = 1;
console.log(1)

자바스크립트에서는 이런식으로 string으로 처음 선언된 str이라는 변수에 number를 할당할 수 있으며,

const getSquared = (n) => n**2;
console.log(getSquared(2)) // 4
console.log(getSquared('a')) // NaN

Integer을 parameter로 받는 함수에 string을 넣어도 코드를 실행하기 전까지는 어떤 문제가 발생하는 지 알 수 없다.

→ 타입스크립트에서는 타입시스템을 통해 자바스크립트에서 발생할 수 있는 여러 오류들을 미리 잡아준다.

타입 선언하기

타입을 규정할 때에는 1. Type By Inference2. Defining Type의 두가지 방법이 있다.

1. Type By Inference
대부분의 변수들은 자동으로 타입이 결정된다.

let helloWorld = "Hello World";

위의 경우에서 변수 helloWorld를 호버하면 string type이라는 메시지를 얻을 수 있다.

2. Defining Types
물론 직접 타입을 선언할 수도 있다. 예를 들어 interface를 통해 object를 규정할 때 이렇게 직접 타입을 선언하는 방법을 이용할 수 있다.

interface User {
    name: string;
    id: number;
}

const user: User = {
    name: 'Gayoung',
    id: 0,
}

타입의 종류

기본적으로 자바스크립트에는 아래의 타입들이 존재한다.

  • boolean
  • bigint(number값이 안정적으로 나타낼 수 있는 최대치인 2^53-1보다 큰 정수를 표현)
  • null
  • number
  • string
  • symbol
  • undefined

타입스크립트에서는 추가적으로

  • any
  • unknown
  • never
  • void

를 지원한다.

추가적으로 type을 생성하기 위해서는 interfacetype, 두가지의 방법이 존재하는데 interface를 쓰는 것이 좋다.


좀 더 복잡한 타입으로 uniongeneric이 있다.

  • union : 여러가지 타입들 중 하나의 타입이 될 수 있음을 의미한다.
type WindowStates = "open" | "closed";

: WindowStates 타입의 변수들은 "open" 또는 "closed"의 값을 갖는다.


  • generics : 타입을 변경할 수 있도록 한다.

가장 대표적인 예시가 Array. Array는 Array<string>, Array<number>Array<Type>의 Type자리에 다양한 타입을 넣음으로써 서로 다른 type을 처리하는 Array를 만들 수 있다.

같은 방식으로 generic을 이용하여 interface를 선언할 수도 있다.

interface Backpack<Type> {
    add: (obj: Type) => void;
    get: () => Type;
}

Backpack interface에서 Backpack<Type>를 선언할 때의 Type에 따라 함수 add 파라미터의 타입과 함수 get의 리턴타입이 결정된다.


Structural Type System

두개의 Object가 같은 모양shape을 가지고 있다면, 그 두개의 object는 같은 type으로 간주된다. → Duck Typing 또는 structural typing

interface Point {
    x: number;
    y: number;
}

function logPoint(p: Point) {
    console.log(`${p.x}, ${p.y}`);
}

const point = {x: 12, y: 7}
logPoint(point);

위에서 하단부에 선언된 pointPoint type으로 선언되지 않았지만 같은 shape를 가지기에 같은 타입으로 간주됐다.

재미있는 것은,

const point = {x: 12, y: 7, z:1}
logPoint(point);

위처럼 pointz라는 변수를 추가해도 정상적으로 작동한다. Point object를 구성하기 위한 required properties(이 경우 x: number, y: number)가 존재한다면 Point object이다.

하지만 pointPoint로 간주되었다 하여도 반대는 성립하지 않을 수 있다.

interface Point {
    x: number;
    y: number;
    a: number;
}

function logPoint(p: Point) {
    console.log(`${p.x}, ${p.y}`);
}

const point = {x: 12, y: 7}
logPoint(point); // error

아래와 같은 에러가 발생한다.

profile
개발블로그

0개의 댓글