

마이크로소프트에서 발표한 오픈소스이며, 구글도 2년간의 검토끝에 사내 표준언어로 승인했다.
//js
function sum(a, b) {
return a + b;
}
sum('x', 'y'); //'xy'
누가 봐도 위의 코드는 숫자의 합산을 의도한 코드같지만 자바스크립트 동적타이핑으로 인해 아무런 에러가 없이 진행되고 두 string이 합쳐진 형태가 return된다.
function sum(a: number, b:number) {
return a + b;
}
sum('x', 'y');
// error TS2345: Argument of type '"x"' is not assignable to parameter of type 'number'.
typescript는 정적타입을 지원하고 컴파일 단계에서 오류를 포착할 수 있다. (코드 가독성, 예측성, 안정성 향상)
객체지향 프로그래밍 지원
Java나 C# 등의 클래스 기반 언어와 같이 인터페이스, 제네릭 등을 지원한다.
private name같은것이 불가능한데, 타입스크립트는 클래스 프로퍼티 선언이 가능하다. 또한 접근제한자도 사용가능하다.//typescript
class Person {
public name: string; //반드시 클래스 프로퍼티 사전 선언해야함
protected age: number;
private address: string;
constructor(name: string) {
this.name = name;
}
}
인터페이스 : 프로퍼티와 메소드를 가질 수 있지만 직접 인스턴스를 생성할 수 없고 모든 메소드는 추상 메소드인 형태
interface Todo {
id: number;
content: string;
completed: boolean;
}
let todos: Todo[] = [];
function addTodo(todo: Todo) {
todos = [...todos, todo];
}
const newTodo: Todo = { id: 1, content: 'ts study', completed: true };
addTodo(newTodo);
//typescript를 안쓴다면?
function checkTodoData(data) {
if (!Array.isArray(data)) {
throw new Error('Data is not Array');
}
const invalidArray = data.some((data) => typeof (data.id) !== 'number' || typeof(data.content) !== 'string' || typeof (data.isCompleted) !== 'boolean');
if (invalidArray) {
throw new Error('Invalid data is included');
}
}
class Queue {
protected data: any[] = [];
push(item: any) {
this.data.push(item);
}
pop() {
return this.data.shift();
}
}
const queue = new Queue();
queue.push(0);
queue.push('1'); //의도치 않은 실수
console.log(queue.pop().toFixed()); //0
console.log(queue.pop().toFixed()); //Runtime error
상속으로 해결해보기
class NumberQueue extends Queue {
push(item: number) {
super.push(item);
}
pop(): number {
return super.pop();
}
}
const queue = new NumberQueue();
queue.push('1'); // error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.
// 에러를 사전에 발견해서 해결가능
하지만 매번 이렇게 타입별로 클래스를 상속받아야하므로 좋은 방법이 아니다.
여기서 제네릭 등장!
class Queue<T> {
protected data: Array<T> = [];
push(item: T) {
this.data.push(item);
}
pop(): T | undefined {
return this.data.shift();
}
}
const numberQueue = new Queue<number>();
numberQueue.push(0);
numberQueue.push(1);
const stringQueue = new Queue<string>();
stringQueue.push('hi');
stringQueue.push('typescript');
제네릭은 선언 시점이 아니라 생성시점에 타입을 명시하여 한번의 선언으로 다양한 타입을 사용할 수 있다는 장점이 있다.
npm install typescript로 설치 (설치확인은 tsc -v)Typescript 컴파일러(tsc)는 .ts파일을 자바스크립트 파일로 트랜스파일링 한다
tsc [파일이름] 입력. (예시 : tsc person)default가 ES3버전으로 컴파일 된다. -t 옵션으로 원하는 버전 선택가능 (예시 :
tsc person -t ES2015)
tsc --init 명령어로 config파일 생성한다. tsconfig.json을 적용하면
tsc만 치더라도 모든 타입스크립트파일들이 트랜스파일링된다. 특정파일만 하려면tsc person과 같이 특정 파일이름을 적어준다.
tsc를 매번 치는것도 번거롭다. ts파일을 저장할때마다 자동으로 컴파일하도록 하자.태스크 러너가 필요하다. Task Runner란 task는 임무, runner는 운반업자, 밀수업자를 뜻한다. 의역하면
임무를 대신해주는 자정도로 번역될 수 있을 거 같다. 주로 빌드 과정의 여러 부분을 자동화해주는 역할을 한다. 예를 들면 번들링이나, 불필요한 공백제거, 파일 난독화 등...


$tsc-watch로 바꿔준다 "watch": true를 추가해준다.
