11-3 타입스크립트
TypeScript
js
function plus(a, b) {
return a + b;
}
console.log(plus(3, 5)); ---> 8
console.log(plus('3', '5')); ---> 35 (문자'3'과 문자'5'를 결합)
==========
ts
function plus(a : number, b : number) { // c, java에서 정수형 변수 선언하는 것과 같은 결
return a + b;
}
console.log(plus(3, 5)); ---> 8
console.log(plus('3', '5')); ---> 컴파일 오류 ('3' != number)
타입스크립트 = 자바스크립트 + 타입체크
.TS 환경에서 자바스크립트를 코딩하면 동작합니다.
.JS 환경에서 타입스크립트를 코딩하면 동작하지 않습니다.
JS가 동작하는 웹브라우저에서 타입스크립트를 이해하지 못 하기 때문.
TS로 작성된 파일은 JS로 컴파일(트랜스 파일) 번역이 되고 난 후 웹브라우저에서 사용이 가능합니다.
.ts ---> tsc (TypeScript 컴파일러) ---> .js
터미널에 아래 코드 입력
npm install -g typescript
버전 확인
tsc --version
app.ts 파일을 바로 실행시킬 경우 아래처럼 오류가 발생합니다.
tsc 파일명 tsc app.ts을 입력하여 js로 컴파일 합니다.
이후 해당 app.js를 실행시키면 잘 실행되는 것을 확인가능 합니다.
설정파일을 생성하는 명령어 입니다.
터미널에
tsc --init
위 코드를 입력하면 설정 파일이 생성됩니다.
또는 프로젝트(루트 폴더)에서 tsconfig.json 파일을 수동으로 생성합니다.
기능
watch mode
TS파일에서 수정/변경이 발생할 경우 일일이 js로 컴파일 하거나 추가로 수정해주어야 하는 일이 발생함.
프로젝트의 모튼 타입스크립트 파일을 컴파일 합니다.
tsc
특정파일을 한 번 컴파일 합니다.
tsc app.ts
====================
프로젝트의 모든 타입스크립트 파일을 자동으로 컴파일 합니다. (수정/변경이 있을 때마다)
tsc -w
특정파일만 자동 컴파일 합니다. (수정/변경이 있을 때마다)
tsc -w app.ts
====================
자동으로 변환되는 것을 멈추려면?
tsc -w 가 실행중인 터미널을 ctrl + c 로 종료시킵니다.
타입스크립트는 자바스크립트에 정적타입을 제공합니다.
정적타입
자바스크립트에서의 변수에는 어떠한 데이터 타입의 값도 할당 할 수 있습니다.
let name = 'kim';
갑자기 어디서 누가 이렇게 변경해버리는 것도 가능
let name = 123;
타입 추론(Type Inference)기능
let a = 10;
기본 데이터 타입, 객체 타입, 특수 타입으로 나눌 수 있습니다.기본 데이터 타입
| 타입 | 의미 |
|---|---|
| number | 숫자 타입으로, 정수와 실수를 포함 |
| string | 문자열 타입 |
| boolean | 참, 거짓을 나타내는 불리언 타입 |
| null | 값이 없음을 나타냅니다 |
| undefined | 값이 할당되지 않은 변수의 기본적인 타입 |
객체 타입
| 타입 | 의미 |
|---|---|
| object | 객체를 나타냅니다 |
| array | 동일한 타입의 요소를 가진 배열 |
| tuple | 각 요소가 다른 타입을 가질 수 있는 배열 |
특수 타입
| 타입 | 의미 |
|---|---|
| any | 어떠한 타입이든 할당될 수 있는 타입 |
| unknown | 타입을 미리 알 수 없는 경우 사용되는 타입 |
let name : string = 'kim';
let age : number = 100;
let gender : string = 'male';
let alive : boolean = true;
function Plus(a : number, b : number) : number { // 매개변수 부분의 뒤에 붙은 : number 가 함수의 반환 타입
return a + b;
}
function Plus(a : number, b : number) : void { // 매개변수 부분의 뒤에 붙은 : void 가 함수의 반환 타입 (반환값 x)
//return a + b;
}
interface Book{
title : string;
isbn : number;
page : number;
category : string;
author : string;
publisher : string;
price : number;
lending : boolean;
}
==================
function book1(isbn : number) : Book { // book1 함수는 Book 타입을 리턴합니다.
return {
title : thisbook, // 리턴값은 Book 타입의 프로퍼티를 가져야합니다.
isbn : isbn,
page : 220,
category : computer,
author : anon,
publisher : abcdefg,
price : 10000,
lending : false
};
}
만약 리턴되는 프로퍼티(속성)중 값이 비어있다면?
// page 부분을 주석처리
==> 컴파일 실패 에러발생
인터페이스를 정의 할 때 프로퍼티에 '?'를 붙여서 선택적 프로퍼티로 만들어주면 됩니다. (? = 있어도 되고 없어도 되고)
interface Book{
title : string;
isbn : number;
page? : number;
category : string;
author : string;
publisher : string;
price : number;
lending : boolean;
}
함수의 경우도 ? 사용이 가능합니다.
호출시 매개변수가 한개만 존재한 경우도 사용이 가능
function Plus ( a : number, b? : number) : number {
return a + b;
}
매개변수가 a만 들어왔을 경우 b부분은 기본값 5가 들어가서 실행됩니다.
function Plus ( a : number, b? : number = 5) : number {
return a + b;
}
interface Book {
category : string;
}
부분에서 category가 string 타입이면 카테고리랑 상관없는 문자열이 들어 갈 수도 있습니다.
=> 제한을 해야함
1.
열거형으로 CategoryType 이라는 타입을 생성합니다.
enum CategoryType {
Comic, //멤버
Society,
Horror,
Music,
Computer
}
2.
인터페이스의 category 타입도 수정합니다.
interface Book {
category : CategoryType;
}
3.
사용하는 부분에서도 열거형의 값에 맞게 수정합니다.
class MyBook implements Book {
~
category : CategoryType.Computer
~
}
보충
enum CategoryType {
Comic,
Society,
Horror,
Music,
Computer
}
에서 enum의 경우 첫번째 멤버가 0이면 그 뒤의 멤버는 1 2 3 이런식으로 증가합니다.
해당 코드에서는
Comic = 0, Society = 1 이런식으로 숫자로 값을 갖고있습니다.
문자열 열거형으로 만드려면
Comic = 'comic',
Society = 'society',
이런식으로 문자열 값을 넣어주면 됩니다.
자바스크립트와 내용이 비슷해서 이해하는데 생각보다 어려운점은 없었지만
인터페이스의 사용과, 클래스 부분의 정리가 필요하다고 느낌
interface Book{
title : string;
isbn : number;
page? : number;
category : string;
author : string;
publisher : string;
price : number;
lending : boolean;
}
class MyBook implements Book { // 의미적으로는 Book을 상속한다는 의미
// Book 인터페이스를 사용해서 MyBook 이라는 클래스를 구현하겠다.
title = 'ABC';
isbn = 1234;
page = 20;
category = 'KIDS';
author = 'aaaa'
publisher = 'bbbb'
price = 4000;
lending = true;
// 메서드가 있다면 오버라이딩 하는 방식으로
}