타입스크립트는 기존의 자바스크립트에서 문제가 되었던 타입을 제대로 표기해주는 식으로 사용할 수 있다. Type
표기의 종류는 다음과 같다.
string
boolean
number
null: 값이 의도적으로 비어 있는 상태
undefined: 아무 값이 할당되지 않은 상태
symbol: ES6에서 추가된 문법
다른 언어를 많이 접하다보니 이러한 타입에 대해서 익숙하긴 하다. 임의의 코드를 만들어 예시를 들어보겠다.
// js
function f1(val) {
result = 1;
return result + val;
}
console.log(f1("1")); // 결과값: 11
console.log(f1(1)); // 결과값: 2
다음과 같은 코드를 작성하게 되면 들어가는 value
의 자료형에 따라 결과값을 다른 형태로 배출하게 되는 모습을 볼 수 있다. 의도적으로 이렇게 만들수도 있지만, 정확한 디버깅이나 가독성 및 유지보수를 위해서는 타입을 지정하는 형식으로 사용한다.
// ts
function f1(val: number): number {
result = 1;
return result + val;
}
console.log(f1("1")); // 결과값: error
console.log(f1(1)); // 결과값: 2
위와 같은 방법으로 작성하게 되면 나타날 수 있는 오류를 방지할 수 있다는 장점이 있다. 추가적으로 메모리에 값을 주소로 저장하고, 출력 시 메모리 주소와 일치하는 값을 출력하는 참조 자료형과 개발자의 편의를 위해 추가로 제공하는 자료형들 또한 더 있다.
object
array
function
tuple: 길이와 각 요소의 타입이 정해진 배열을 저장하는 타입
enum: 특정 값의 집합을 저장하는 타입
any, void, never
let arr: [string, number] = ["Hi", 6];
enum Car {
BUS = 1,
TAXI = 2,
SUBWAY = 3,
}
let bus: Car = Car.BUS; // 인덱스 번호로도 접근 가능
let subway: string = Car[3];
사실 이 개념을 많이 안써봐서 직관적으로 어떻게 써야겠다라는 감이 안오기는 하지만, 우선 각 타입이 어떠한 것을 의미하는지는 알아두면 좋을 것 같아서 이에 관해서 정리해두고 나중에 시도해보려고 한다.
Partial<T>
interface
가 들어가면 인터페이스 내의 값을 선택적으로 사용할 수 있음Readonly<T>
Record<T>
Pick<T, K>
Omit<T, K>
Exclude<T, U>
Extract<T, U>
NonNullable<T>
Parameters<T>
ConstructorParameters<T>
ReturnType<T>
Required<T>
// 실사용 예제
interface Todo {
title: string;
description: string;
completed: boolean;
}
type TodoPreview = Omit<Todo, "description">;
type TodoPreview = Pick<Todo, "title">;
const todo: TodoPreview = {
title: "Go to the market",
completed: false,
};
const todo: TodoPreview = {
title: "Wash face",
};
자바스크립트와 타입스크립트의 함수는 일급 객체이다. 일급 객체의 조건은 다음과 같다.
타입스크립트 함수 작성 시 반환 타입을 추론하도록 하는 것을 권장하고, 함수의 매개 변수와 인수의 타입이 호환 가능하게 작성하여야 하며, 인수의 타입을 잘못 전달하면 에러가 발생하도록 해야 한다.
// 선택적 매개변수
function f1(val1: number, val2?: number): number {
if (val2) return val1 + val2;
else return val1;
}
f1(2, 3); // 5
f1(2); // 2
위와 같은 형식으로 사용한다면 두 번째 인자를 받든 안받든 간에 그에 따른 결과를 출력할 수 있다.
정보처리기사를 준비하면서 봐왔던 객체 지향 프로그래밍에 대한 개념과 거의 유사했다. 객체들은 서로 메세지를 주고 받을 수 있으며, 데이터를 처리할 수 있다는 특징을 가진다.
public, private
와 같은 키워드들로 명시적 타입 표시가 가능하다.
extends
키워드를 활용하여 상위클래스에서 하위클래스로 확장할 수 있다.Person
에서 파생된 Employee
의 인스턴스 메소드에서는 name
을 사용할 수 있다.private
로 설정하고, 속성값을 읽고 수정하는 getter/setter
함수를 사용한다.class Something {
static origin = { a: 0, b: 0 };
add(): number {
return Something.origin.a + Something.origin.b;
}
}
const some = new Something();
Something.origin = { a: 1, b: 1 };
console.log(some.add()); // 2
abstract
키워드는 추상 클래스나 추상 메소드를 정의하는 데 사용된다abstract class Animal {
protected name: string;
constructor(name: string) {
this.name = name;
}
abstract makeSound(): void;
}
class Dog extends Animal {
constructor(name: string) {
super(name);
}
makeSound(): void {
console.log(`${this.name} 멍멍!!`);
}
}
const dog = new Dog("개");
dog.makeSound(); // 개 멍멍!!