만약 자바스크립트에서 string타입을 지정하려면 아래같이 선언할 수 있다.
const str = 'hello world'
그런데 string의 약자인 str이라고 명시 해놓고 잘못하다 숫자를 지정해 줄 수도 있다. 아래와 같이 말이다.
const str = 1;
자바스크립트에서는 str은 그냥 변수명이기 때문에 개발자가 string타입을 할당하고 싶은지, number타입을 할당하고싶은지 모르는 것이다.
TypeScript에서는 이런 오류를 사전에 잡을 수 있다.
const str: string = 'hello world'
만약 사용자가 실수로 변수를 string타입으로 지정하고 할당을 잘못해도 Typescript는 오류를 잡아준다.
let str = string;
string = 1; // type error: Type 'number' is not assignable to type 'string'
자바스크립트로 파일을 작성했더라면 코드를 실행하고 나서야 오류를 발견했을 것이다.
TypeScript의 원시 타입에는 string, number, 그리고 boolean이 존재한다.
각 선언방식은 아래와 같다.
const str: string = 'hello world'
const num: number = 1;
const boo: boolean = true;
TypeScript에서 배열을 선언하는 방식은 두 가지가 있다.
1.number[]
방식
const arr1: number[] = [1, 2, 3];
const arr2: string[] = ['hello', 'world'];
배열 모양의 바로 앞에 안의 요소들의 타입을 정의하는 방식이다.
Array<number>
방식const arr1: Array<number> = [1, 2, 3];
const arr2: Array<string> = ['hello', 'world'];
방식만 다를 뿐이지 위와 같다.
특이한 점은 Array
같이 첫 문자를 대문자로 써줘야한다.
[number]
이라고 헷깔릴 수도 있는데 이는 배열이 아니라 튜플이다.
자바스크립트에는 존재하지 않는 타입으로 길이와 타입이 고정된 배열이다.
만약 길이는 2이고 첫 번째 인자는 number
두 번째 인자는 string
으로 이루어진 배열을 생성하고 싶다면, 다음과 같이 선언하면 된다.
const arr: [number, string] = [1, 'hello'];
객체는 단순하게 object
라고 선언하면 된다.
const obj: object = {};
그런데 만약 key
마다의 타입을 정하고 싶으면 아래와 같이 선언하면 된다.
const game: { title: string, playtime: number } = {
title: 'superMario',
playtime: 20
};
key
에대한 타입임으로 아래와 같이 순서를 바꿔도 된다.
const game: { title: string, playtime: number } = {
playtime: 20,
title: 'superMario'
};
TypeScript에서 함수의 입력 및 출력 타입을 지정할 수 있다.
function multiply(a: number, b: number) {
return a * b;
}
function say(): string {
return 'hi';
}
아래는 화살표 함수 version
const say = (): string => 'hi';
function add(a: number, b: number): number {
return a + b;
}
JavaScript는 유연한 언어여서 함수의 매개변수가 3개인 함수에 5개의 인자를 넘겨도 오류가 나지 않는다.
function add(a, b) {
return a + b;
}
add(1, 2, 3) // 3;
하지만 TypeScript에서는 오류가 난다.
function add(a: number, b: number): number {
return a + b;
}
add (1, 2, 3) // error: Expected 2 arguments, but got 3.
add (1) // error: An argument for 'b' was not provided.
위의 오류는 2개의 인자를 예상했는데 3개의 인자를 넘겨줬다는 뜻이고, 아래오류는 b
인자를 넘겨받지 못했다는 것이다.
만약 b의 인자를 넣지 않아도 오류가 나지 않게 하기 위해서는 옵셔널 파라미터 ?
를 이용하면 된다.
function printA(a: number, b?: number): number {
return a;
}