타입스크립트는 MS에서 개발한 오픈소스로, 자바스크립트의 상위 집합(Superset)인 정적 타입 언어이다.
동적 타입 언어인 자바스크립트에 강한 타입 시스템을 적용해서 컴파일 환경에서 대부분의 에러를 확인할 수 있게 된다.
TS는 JS가 실행되는 모든 환경, 플랫폼에서 사용될 수 있고, 최신 ECMAScript 기능을 지원한다.
또한 객체 지향 프로그래밍 환경을 제공함으로 class, interface, extends, 제네릭 등을 그대로 사용할 수 있다.
1. npm i typescript
2. tsconfig.json 설정
{
"compilerOptions": { // 실제 컴파일 할 경우 적용되는 옵션들
"module": "commonjs", //어떤 모듈 방식으로 컴파일할지 설정
"target": "ES2015", // 어떤 버전으로 컴파일할지 작성
"sourceMap": true, // 해당하는 .map 파일을 생성
"outDir": "dist" // 컴파일한 것들을 dist에 저장
},
"include": ["src/**/*"], // 컴파일할 경로 설정
"exclude": ["node_modules"] // 컴파일 대상을 제외하는 옵션
}
3. 컴파일
타입스크립트는 .ts확장자를 가진 파일로 작성할 수 있고, index.ts 파일을 작성하고 터미널에 tsc를 입력하면 index.js 와 index.map이 생성된다.
(tsc --watch 명령어를 사용하면 트랜스파일링 대상 파일의 내용에 변경이 감지되었을 때 자동으로 트랜스파일링이 실행된다.)
node.js는 typescript로 이해하지 못하기 때문에 일반적인 javascript코드로 컴파일하는 작업이 필요하다.
// Javascript
const name = "kevin",
age = 24,
gender = "male";
const sayHi = (name, age, gender?) => { // gender 뒤에 ?는 필수가 아닌 선택적으로 값을 받는다는 의미
console.log(`Hello ${name}, you are ${age}, you are a ${gender}`);
};
sayHi(name, age, gender);
// TypeScript
const sayHi = (name: string, age: number, gender?: string): string => {
return `Hello ${name}, you are ${age}, you are a ${gender}`;
};
console.log(sayHi("kevin", 24, "male"));
export {};
타입 선언
1. 불린: Boolean
let isDone: boolean = false;
2. 숫자: number
let num: number;
let num: number = 24;
let float: number = 3.14;
3. 문자열: string
let str: string;
let name: string = "kevin"
let myName: string = `my name is ${name}`
4. 배열: array
let color: string[] = ["red", "white", "black"];
// or
let color: Array<string> = ["red", "white", "black"];
let array: (string | number)[] = ["red", 1, 42, "black"];
// or
let array: Array<string | number> = ["red", 1, 42, "black"];
// 항목의 값을 단언할 수 없다
let arr: any[] = [0, 4, {}, [], 'str', false];
5. 튜플: Tuple => 정해진 타입의 고정된 길이(length) 배열
// Tuple
let user: [number, string, boolean] = [1234, 'Hello', true];
console.log(user[0]); // 1234
console.log(user[1]); // 'HEROPY'
console.log(user[2]); // true
// readonly 키워드를 사용해 읽기 전용 튜플을 생성
let a: readonly [string, number] = ['Hi', 123];
6. 열거형: Enum
// 기본적으로 0부터 시작하며 값은 1씩 증가
enum Week {
Sun, //0
Mon, //1
Tue, //2
Wed, //3
Thu, //4
Fri, //5
Sat //6
}
// 수동으로 값을 변경할 수 있으며, 값을 변경한 부분부터 다시 1씩 증가
enum Week {
Sun, //0
Mon = 22, //22
Tue, //23
Wed, //24
Thu, //25
Fri, //26
Sat //27
}
7. 모든 타입: any
// 자주쓰지 않는걸 추천
const any: any[] = [1, "hi", true]
8. 알 수 없는 타입: undefined
let a: any = 123;
let u: unknown = 123;
let v1: boolean = a; // 모든 타입(any)은 어디든 할당할 수 있습니다.
let v2: number = u; // 알 수 없는 타입(unknown)은 모든 타입(any)을 제외한 다른 타입에 할당할 수 없습니다.
let v3: any = u; // OK!
let v4: number = u as number; // 타입을 단언하면 할당할 수 있습니다.
9. 객체: object
let obj: object = {};
let arr: object = [];
let func: object = function () {};
let userA: { name: string, age: number } = {
name: 'kevin',
age: 123
};
let userB: { name: string, age: number } = {
name: 'kevin',
age: false, // Error
email: 'kevin@gmail.com' // Error
};
interface Human {
name: string;
age: number;
gender: string;
}
const person = {
name: "kevin",
age: 24,
gender: "male"
};
const sayHi = (person: Human): string => {
return `Hello ${person.name}, you are ${person.age}, you are a ${
person.gender
}!`;
};
console.log(sayHi(person));
export {};
접근 제한자
class Human {
public name: string;
private age: number;
public gender: string;
constructor(name: string, age: number, gender: string) {
this.name = name;
this.age = age;
this.gender = gender;
}
}
const lynn = new Human("Lynn", 18, "female");
const sayHi = (lynn: Human): string => {
return `Hello ${lynn.name}, you are ${lynn}, you are a ${
lynn.gender
}!`;
};
console.log(sayHi(lynn));
export {};