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 Inference 와 2. 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,
}
기본적으로 자바스크립트에는 아래의 타입들이 존재한다.
타입스크립트에서는 추가적으로
를 지원한다.
추가적으로 type을 생성하기 위해서는 interface
와 type
, 두가지의 방법이 존재하는데 interface
를 쓰는 것이 좋다.
좀 더 복잡한 타입으로 union
과 generic
이 있다.
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
의 리턴타입이 결정된다.
두개의 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);
위에서 하단부에 선언된 point
는 Point
type으로 선언되지 않았지만 같은 shape를 가지기에 같은 타입으로 간주됐다.
재미있는 것은,
const point = {x: 12, y: 7, z:1}
logPoint(point);
위처럼 point
에 z
라는 변수를 추가해도 정상적으로 작동한다. Point
object를 구성하기 위한 required properties(이 경우 x: number, y: number
)가 존재한다면 Point
object이다.
하지만 point
가 Point
로 간주되었다 하여도 반대는 성립하지 않을 수 있다.
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
아래와 같은 에러가 발생한다.