24년 1월 29일 강의를 들은 내용을 기록한 글입니다.
타입스크립트
자바스크립트 프로젝트가 커지면 코드 관리가 어렵고, 디버깅이 어려워진다는 단점이 있다. 이를 보완하기 위해 사용하는 것이 타입스크립트이다.
=> 자바스크립트 + 타입 체크
📘타입 체크?
- 자바스크립트에서는 변수의 데이터타입을 명확하게 알 수 없어서 안정성이 떨어진다.
- 타입스크립트는 변수의 데이터타입을 명시하기 때문에 자바스크립트보다 안정성이 높다.
■ 자바스크립트 vs 타입스크립트
두 수를 전달 인자로 받아 두 수를 더한 결과를 리턴하는 함수
1
2
3
4
5
6
| // javascript
function plus(a, b) {
return a + b;
}
console.log(plus(3, 5)); // 8
console.log(plus("3", "5")); // "35"
|
1
2
3
4
5
6
7
| // typescript
function plus(a: number, b: number) {
return a + b;
}
console.log(plus(3, 5)); // 8
console.log(plus("3", "5")); // Error!
|
📘타입스크립트를 사용하면 좋은점?
- 런타임 전, 컴파일 타임 때 오류를 체크할 수 있음
- 자바스크립트 기반보다 버그를 줄일 수 있음
- 유지보수가 쉽다
- 높은 퀄리티의 코드를 생산할 수 있음
타입스크립트 환경설정
1
| npm install typescript --save-dev
|
- 타입스크립트 자동 컴파일
코드가 수정될 때마다 자동으로 컴파일 시키기
- 타입스크립트 설정 파일 자동으로 설정하기 (tsconfig.json)
- 타입스크립트 설정 파일 수동으로 설정하기 (tsconfig.json)
루트 폴더에 tsconfig.json
파일을 생성하고, 설정 값 작성하기
타입스크립트 타입 추론
- 타입스크립트는 타입 추론 기능을 통해 변수의 타입을 자동으로 판단
- 타입스크립트는 초기화된 값을 바탕으로 선언된 타입을 추론함
-> 만약 다른 타입이 할당되면 오류를 발생시킴 - 타입 추론이 모호한 경우나 복잡한 로직에서는 타입을 명시하는 것이 좋음
1
2
3
4
| // javascript
let myname = "lee";
myname = 1;
|
1
2
3
4
5
6
| // typescript
let myname = "lee";
myname = 1; // Error!
// Type 'number' is not assignable to type 'string'.(2322)
// let myname = string;
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| // typescript
const student = {
name: "john",
course: "typescript",
score: 100,
grade: function () {
console.log("A");
}
};
student.name = "lee";
student.score = "90"; // Error!
// Type 'string' is not assignable to type 'number'.(2322)
// (property) score: number
|
📘타입스크립트 타입 종류
기본 데이터
- number
- string
- boolean
- null: 의도적으로 값이 없음을 할당
- undefined: 값이 없음 (기본값)
객체
특수
- any: 어떠한 타입이든 할당
- unknown: 타입을 미리 알 수 없는 경우
타입 명시
변수를 선언할 때 변수 값의 타입을 작성해서 변수의 타입을 지정
📘문법
1
2
3
4
5
| const 변수: 타입 = "값";
function 함수명(param:param_타입):함수_반환(결과값)타입{
// 함수 내용
}
|
■ 예시
1
2
3
| const name: string = "김말숙";
const num: number = 123;
const complete: boolean = false;
|
1
2
3
4
| function plus(a: number, b: number): number {
return a + b;
}
const add = (a: number, b: number): number => a + b;
|
인터페이스
- 사용자 정의 타입
- 인터페이스를 클래스에 상속할 수 있음
- 옵셔널하게 지정할 수 있음,
?
- 메소드도 선언 가능 (인터페이스를 상속 받는 클래스는 반드시 메소드 오버라이딩을 해줘야 함)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
| interface IStudent {
id: number;
name: string;
age: number;
gender: string;
course: string;
complete: boolean;
}
const students: IStudent[] = [];
function createNewStudent(
name: string,
age: number,
gender: string,
course: string
): IStudent {
const lastStudentId = !students.length
? null
: students[students.length - 1].id;
const newId = lastStudentId ? lastStudentId + 1 : 0;
return {
id: newId,
name,
age,
gender,
course,
complete: false
};
}
console.log(createNewStudent("김말숙", 20, "female", "typescript"));
|
1
2
3
4
5
6
7
8
9
| // 결과값
{
id: 0,
name: '김말숙',
age: 20,
gender: 'female',
course: 'typescript',
complete: false
}
|
📘옵셔널 타입
:
앞에 ?
을 작성하면 옵셔널로 타입을 받아서 사용할 수 있음
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| interface IStudent {
id: number;
name: string;
age?: number;
gender: string;
course: string;
complete: boolean;
}
function getInfo(
id: number,
name: string,
gender: string,
course: string
): IStudent {
return {
id,
name,
gender,
course,
complete: false
};
}
const student = getInfo(20, "공갈치", "male", "typescript");
function setInfo(student: IStudent): void {
console.log(student);
}
setInfo(student);
|
1
2
3
4
5
6
7
8
| // 결과값
{
id: 20,
name: '공갈치',
gender: 'male',
course: 'typescript',
complete: false
}
|
📘메소드 정의
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| interface IStudent {
id: number;
name?: string;
age?: number;
gender?: string;
course?: string;
complete?: boolean;
setName: (name: string) => void;
getName: () => string;
}
class MyStudent implements IStudent {
id = 00700;
name = "제임스본드";
age = 40;
gender = "male";
course = "node.js";
complete = true;
setName(name: string): void {
this.name = name;
console.log(`이름 설정: ${this.name}`);
}
getName() {
return this.name;
}
}
const myInstance = new MyStudent();
myInstance.setName("엘리스"); // 이름 설정: 엘리스
console.log(myInstance.getName()); // 엘리스
|
타입스크립트 enum
- 사용자정의 타입 (열거형)
- 코드의 가독성이 향상됨
- 오타를 방지할 수 있음
📘문법
1
2
3
4
5
| enum 사용자정의이름 {
값1,
값2,
값3
}
|
- 별도로 값을 지정하지 않으면 0부터 순차적으로 할당됨
1
2
3
4
| enum GenderType {
Male,
Female
}
|
1
2
| GenderType.Male: 0
GenderType.Female: 1
|
- 값을 지정할 수도 있음 (숫자, 문자 모두 가능)
1
2
3
4
5
6
| enum ColorEnum {
Red,
Green,
Blue = "Blue",
Pink = 3
}
|
1
2
3
4
| ColorEnum.Red: 0
ColorEnum.Green: 1
ColorEnum.Blue: "Blue"
ColorEnum.Pink: 3
|
📘예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
| enum GenderType {
Male = "male",
Female = "female"
}
interface IStudent {
id: number;
name?: string;
age?: number;
gender?: GenderType;
course?: string;
complete?: boolean;
setName: (name: string) => void;
getName: () => string;
}
class MyStudent implements IStudent {
id = 00700;
name = "제임스본드";
age = 40;
gender = GenderType.Male;
course = "node.js";
complete = true;
setName(name: string): void {
this.name = name;
console.log(`이름 설정: ${this.name}`);
}
getName() {
return this.name;
}
}
|