MS에서 개발하고 관리하는 오픈소스 프로그래밍 언어다.
자바스크립트 기반으로 변수 데이터 타입을 지정하여 예측 가능한 코딩이 가능하게 만든다.
TS 파일(.ts)는 브라우저에서 동작하지 않으므로 TS 컴파일러(tsc)를 이용해 자바스크립트 파일로 변환해야 한다.
참조: 타입스크립트란?
JS와 다른 C계열 과의 차이 크게 2개로 분류: 비동기, 타입.
이중 타입은 JS만의 특징은 아니다. PY과 같이 런타임에 정해지는 스크립트 언어도 존재한다. 여튼 그런 이유로 컴파일 언어
와는 다르게 정적 타입
으로 사전에 체크할 수가 없었고, 이를 해결하고 실행 전 단계에서 에러를 최대한 거르고자 여러가지 방법이 나왔다.
그 중 하나가 바로 TS다.
TS = JS의 상위호환(SuperSet), 타입을 가진JS
여기에 class, interface등을 추가해서 JAVA나 C#과 같은 OOP 프로그래밍을 할 수 있다.
인터프리터 언어
인 JS와는 다르게 컴파일 언어
인데, 전통적인 C계열의 컴파일 언어와는 차이가 있어트랜스파일 언어
라고도 부른다.
동작 방식 TS -> (컴파일(트랜스파일)) -> JS -> (실행)과 같이 이루어지는데, TS가 JS로 변환될 때 helper 코드가 위아래로 추가되기 때문에, 절대적인 코드의 양 자체는 TS가 더 많다.
물론 개발자는 TS만 작성하고, 변환은 알아서 해주믈 크게 문제되는 부분은 아니다.
tsconifg.json을 통해 JS파일 변환 시의 설정(경로, 버전 등)을 할 수 있다.
참조: 자세한 설정 방법
function add(a: number, b: number) {
return a + b;
}
const sum: number = add(1, 2);
console.log(sum);
설명
JS였다면 add에 어떤 타입이 들어가도 error검출을 하지 못 했겠지만, TS에서는 add('a', 'b')와 같은 식으로 작성(호출)하면 타입이 맞지 않아서 컴파일을 할 수 없다.(C계열과 동일하게 IDE에서 빨간 줄이 나온다.)
타입에 대해 살펴보자면, JS의 기본 자료형을 모두 포함하고, Any, Void, Never, Enum 등의 타입이 더 제공된다.
function add( a:Any, b:Any ){ ...
와 같다면 아무거나 들어가도 되는데, 이러면 JS를 쓰는 것과 차이가 없다.순수 JS는 컴파일 타임에 타입을 알 수 없기 때문에, 타입 추론을 통해 런타임에 타입을 정하게 된다.
var: ES5 이전까지 쓰이던 변수 키워드. 함수 스코프에서 유효하다. 재선언이 가능하고, 호이스팅도 가능하다.
let, const: ES6부터 쓰이는 변수 키워드. 블록({}) 스코프에서 유효하다. 재선언 및 호이스팅이 불가능하다.
스코프나 재선언은 감이오지만 호이스팅 개념은 애매하다.
C계열 언어를 써온 개발자라면, 잘 이해되지 않는 개념이다.
console.log(sayHi); // 정상출력
var sayHi = "호이스팅이 가능합니다."
console.log(sayHello); // 에러발생
let sayHello = "호이스팅이 불가능합니다."
결론 let, const를 사용하자.
JS 변수 선언 개념에서 추가적인 내용만 적어본다.
let의 타입추론은 일반적 타입이 된다. 즉,
let b = 'hi' // string
이렇게 추론되는 반면, const는 literal로 타입추론이 된다.
const d = 'hi' // type: 'hi'
캐스팅
과는 다르다. 캐스팅은 실제 데이터 구조를 바꾸는 것이고, Type Assertion은 단순히 컴파일러에게 알려주는 용도이다. 아래 두 가지 방법이 있다.Type Alias: 타입의 별칭으로, type의 reference이다. C++에서의 변수 alias와 유사하다.
Union Type: 여러 타입을 허용하는 것으로, Any의 하위호환으로 볼 수 있다. 단순한 개념이다.
ex) let b: string | number; // string 및 number 타입 허용
Type Alias와 Union Type을 함께 사용하면, 다음과 같이도 사용할 수 있다.
type StringOrNumber = string | number; // Type Alias
let b: StringOrNumber; // Union Type by Type Alias
JS에서 prototype으로 흉내내던 객체지향 프로그래밍이 TS에서 더 견고해졌다.
npm init
(nodejs의 설치는 기본이다.)
init 명령어 입력 후 여러 옵션입력이 요구되며, 미입력시 default값으로 세팅된다.
package name: (nodeExpressTypeGood) // 프로젝트 이름
version: (1.0.0) // 프로젝트 버전
description: // 프로젝트 설명
entry point: (index.js) // 프로젝트 시작 파일(자바의 main메소드)
test command: // 테스트를 위한 명령어
git repository: // 연결된 git repo 주소
keywords: // 프로젝트 관련 해시태그?
author: // 제작자
license: (ISC) // 라이센스 종류
마지막으로 yes
입력하면 된다.
내 과정
nodejs 사이트에서 최신버전 lts를 설치하였고, cmd 관리자 권한으로 실행해서npm i -g npm
으로 최신버전 업데이트 진행했다.
※버전 확인시 Powershell은 안되고 cmd는 가능했다.
시스템 속성 변경의 환경변수 path에C:\Users\kyc\AppData\Roaming\npm
를 추가했다.
c:\Workcpace\typescript_study
폴더에npm init
을 했다.
packge name: 에 대문자는 안되는듯 하다. 소문자로
nodeexpresstypegood
을 넣었다.
npm i express typescript @types/express
npm i -D nodemon ts-node
tsc --init
TS가 정상 설치 되었다면, 명령어 실행이 가능하다.
내 과정
tsc --init
하면 tsc 명령어 인식을 하지 못한다.
npx tsc --init
을 사용하여 초기화 시켰다.
tsconfig.ts 파일 설정
아래와 같이 설정하였다.{ "target" : "es6", // 어떤 버전으로 컴파일할지 작성 "module" : "commonjs", //어떤 모듈 방식으로 컴파일할지 설정 "outDir" : "./dist" // 타입스크립트가 자바스크립트로 빌드된 파일들 모아두는 폴더명 .... }
그외 설정은 주석으로 설명되어있다.
이제 코딩을 해서 API 서버를 만들어 본다.
간단하게 HTTP의 GET메소드 API 하나에 TS스러운 객체 하나를 리턴해 보는 코드를 작성해 본다.
프로젝트 경로에 app.ts 파일을 만든다.
app.ts
import express, { Request, Response } from 'express'; const app = express(); type Data = { name: string; age: number; url: string; }; const sendData: Data = { name: 'name', age: 3, url: 'tistory.com', }; app.get('/get', (req: Request, res: Response) => { res.send(sendData); }); app.listen(8080)
서버 실행하기 위해서 package.json의 script부분을 수정해야 한다.
설치해둔 ts-node가 활약할 시간.
// 기존
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
// 변경
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "nodemon app",
"dev": "nodemon --watch \"*.ts\" --exec \"ts-node\" app.ts"
},
결과