본 포스팅은, '캡틴판교'님이 작성하신 '타입스크립트 핸드북'을 보고 스스로 정리하기 위해 작성하는 포스팅입니다. 자세한 내용은 https://joshua1988.github.io/를 참고해주세요!
자바스크립트에 타입을 부여한 자바스크립트의 확장된 언어이다. TypeScript의 장점은 다음과 같다.
function sum(a: number, b: number) {
return a + b;
}
sum('10', '20'); // Error: '10'은 number에 할당될 수 없습니다.
=> 입력값의 type을 number로 지정해주어 원하지 않은 값이 입력값으로 오는 것을 막아준다.
function sum(a: number, b: number): number {
return a + b;
}
var total = sum(10, 20);
total.toLocaleString();
=> sum 함수에서 return 되는 값을 예측하여 타입을 자동으로 바인딩해주어 vscode 사용시 tab으로 빠르고 정확하게 코드를 작성해나갈 수 있다.
타입이 배열인 경우 간단하게 아래와 같이 선언
let arr: number[] = [1,2,3];
let arr: Array<number> = [1,2,3]; //generic 사용
튜플은 배열의 길이가 고정되고 각 요소의 타입이 지정되어 있는 배열 형식을 의미한다.
let arr: [string, number] = ['hi',10];
이 때, 정의하지 않은 타입, 인덱스로 접근할 경우 오류가 발생한다.
C, Java와 같은 다른 언어에서 흔하게 쓰이는 타입으로 특정 값(상수)들의 집합을 의미
enum Avengers { Capt, IronMan, Thor }
let hero: Avengers = Avengers.Capt;
// 1. 이넘은 인덱스 번호로도 접근 가능
let hero: Avengers = Avengers[0];
// 2. 만약 원한다면 이넘의 인덱스를 사용자 편의로 변경해 사용할 수도 있다.
enum Avengers { Capt == 2, IronMan, Thor }
// => 배열의 인덱스가 2부터 시작!
let hero: Avengers = Avengers[2]; // Capt
let hero: Avengers = Avengers[4]; // Thor
모든 타입에 대해서 허용한다는 의미로, 기존에 js로 구현되어 있는 웹 서비스 코드에 ts를 점진적으로 적용할 때 활용하면 좋은 타입
let str: any = 'hi';
let num: any = 10;
let arr: any = ['a', 2, true];
변수에는 undefined
와 null
만 할당하고, 함수에는 반환 값을 설정할 수 없는 타입
let unuseful: void = undefined;
function notuse(): void {
console.log('sth');
}
함수의 끝에 절대 도달하지 않는다는 의미를 지닌 타입
function neverEnd(): never {
while (true) {
}
}
웹 애플리케이션을 구현할 때 자주 사용되는 함수는 타입스크립트로 크게 다음 3가지 타입을 정의할 수 있다.
function sum(a: number, b: number): number {
return a + b;
}
기존 자바스크립트 함수의 선언 방식에서 매개변수와 함수의 반환 값에 타입을 추가하였다.
이 때, 함수의 반환 값에 탑입을 정하지 않을때는 void
라도 사용!
ts에서는 함수의 인자를 모두 필수 값으로 간주한다. 따라서, 함수의 매개변수를 설정하면 undefined
나 null
이라도 인자로 넘겨야하며 컴파일러에서 정의된 매개변수 값이 넘어 왔는지 확인한다. 달리 말하면 정의된 매개변수 값만 받을 수 있고 추가로 인자를 받을 수 없다는 의미이다.
function sum(a: number, b: number): number {
return a + b;
}
sum(10, 20); // 30
sum(10, 20, 30); // error, too many parameters
sum(10); // error, too few parameters
위와 같은 특성은 정의된 매개변수의 갯수만큼 인자를 넘기지 않아도 되는 자바스크립트의 특성과 반대된다. 만약 이러한 특성을 살리고 싶다면 ?
를 이용해서 아래와 같이 정의한다.
function sum(a: number, b?: number): number {
return a + b;
}
sum(10, 20); // 30
sum(10, 20, 30); // error, too many parameters
sum(10); // 10
(function sum(a: number, b='100'): number {
function sum(a: number, ...nums: number[]): number {
//
const totalOfNums = 0;
for (let key in nums) {
totalOfNums += nums[key];
}
return a + totalOfNums;
}
console.log(sum(1,2,3,4,5,6));
// a = 1, nums = [2,3,4,5,6]
JS ES6 비구조화 할당 문법
배열이나 객체의 속성을 해체하여 그 값을 개별 변수에 담을 수 있게 하는 자바스크립트 표현식이다.
간단하게 정리하면 배열[], 혹은 객체 {} 안의 값을 편하게 꺼내 쓸 수 있는 문법이다.var { a1, a2, ...rest_a } = { a1 : 10, a2 : 20, a3 : 30, a4 : 40 }; console.log(a1); // 10 console.log(a2); // 20 console.log(rest_a); // { a3: 30, a4: 40 }
출처 (https://yuddomack.tistory.com/entry/자바스크립트-문법-비구조화-할당)
타입스크립트에서 this가 가리키는 것을 명시하려면 아래와 같은 문법을 사용한다.
function 함수명(this: 타입) {
// ...
}
interface Vue {
el: string;
count: number;
init(this: Vue): () => {};
}
let vm: Vue = {
el: '#app',
count: 10,
init: function(this: Vue) {
return () => {
return this.count;
}
}
}
let getCount = vm.init();
let count = getCount();
console.log(count); // 10
앞에서 살펴본 일반적인 상황에서의 this
와는 다르게 콜백으로 함수가 전달되었을 때의 this
를 구분해줘야 할 때가 있다. 그럴땐 아래와 같이 강제할 수 있다.
interface UIElement {
// 아래 함수의 `this: void` 코드는 함수에 `this` 타입을 선언할 필요가 없다는 의미입니다.
addClickListener(onclick: (this: void, e: Event) => void): void;
}
class Handler {
info: string;
onClick(this: void, e: Event) {
// `this`의 타입이 void이기 때문에 여기서 `this`를 사용할 수 없다.
console.log('clicked!');
}
}
let handler = new Handler();
uiElement.addClickListener(handler.onClick);
클래스의 메서드 방식으로 선언하는 것과 변수에 화살표 함수를 연결하는 것의 차이점!
Handler 유형의 개체 당 하나의 화살표 함수가 생성됩니다. 반면에 메서드는 한 번만 생성되고 Handler의 프로토 타입에 첨부됩니다. 핸들러 유형의 모든 오브젝트간에 공유됩니다.