package
시작npm init -y
typescript
설치npm i -D typescript
tsconfig.json
을 생성한다.
touch tsconfig.json
명령어를 터미널에 입력해 생성하거나tsconfig.json
을 생성한다.bash
로 touch
를 사용할 수 있다.ts
파일을 컴파일할 수 있도록 tsconfig.json
에 옵션을 추가한다.
"include": ["src"]
: src
폴더의 모든 파일 검사해 ts
파일 검색"compilerOptions": { "outDir": "build" }
: js
로 컴파일한 파일을 build
라는 폴더에 추가package.json
의 scripts
에 "build": "빌드명"
을 입력
npm run build
로 컴파일
// 컴파일 전 typescript
const hello = () => "hi";
// 컴파일 후 javascript
var hello = function () {
return "hi";
};
"target": "JS 버전"
: 해당 javascript
버전으로 컴파일 함// 원본 ts
const hello = () => "hi";
// "ES3"로 설정한 경우
var hello = function () {
return "hi";
};
// "ES6"로 설정한 경우
const hello = () => "hi";
target
을 ES3
로 맞추고 class를 작성해 보면 class가 없던 ES3 시절의 class 구현을 엿볼 수 있다.// typescript class
class Block {
constructor(private data: string) {}
static hello() {
return "hi";
}
}
// ES3 class
var Block = /** @class */ (function () {
function Block(data) {
this.data = data;
}
Block.hello = function () {
return "hi";
};
return Block;
}());
"lib"
: 사용자가 어떤 API를 사용하고 어떤 환경에서 코드를 실행하는 지 지정한다.
"ES6"
를 입력하면 해당 문법 자동완성을 나타내주고, "DOM"
을 입력하면 브라우저 문법(window
, document
)에 접근할 수 있다.실제로 typescript
는 javascript
로 이루어진 라이브러리를 사용할 때 그것의 call signatures 등을 알지 못하기에 에러를 생성한다.
*.d.ts
라는 이름을 가진 파일이 그 역할을 한다. 여기서 d는 declare
를 의미한다.// exPackage.js
export function init(config) {
return true;
}
export function exit(code) {
return code + 1;
}
// index.ts
import { init, exit } from "myPackage";
// 모듈 'myPackage'에 대한 선언 파일을 찾을 수 없습니다.
js
로 이루어진 라이브러리를 ts
에서 호출한다면 모듈을 찾을 수 없다는 에러와 함께 함수를 실행할 수 없다.exPackage.d.ts
를 생성해 해당 모듈을 declare
해야 한다.// exPackage.d.ts
interface Config {
url: string;
}
declare module "myPackage" {
function init(config: Config): boolean;
function exit(code: number): number;
}
이러한 작업 빈도가 높지는 않겠지만, 대부분의 라이브러리가 어떻게 ts
에서 호출 가능한지 개념을 알 수 있기에 숙지해둘 필요가 있다.
모듈이 아닌 js
파일을 호출해 사용할 때는 다음과 같이 설정한다.
tsconfig.json
에 allowJS
를 추가한다.// @ts-check
을 입력한 후 JSDoc 주석(/** */
)을 활용해 파라미터와 리턴값의 형태를 지정한다.// exPackage.js
// @ts-check
/**
* Initializes the project
* @param {object} config
* @param {boolean} config.debug
* @param {string} config.url
* @returns {void}
*/
export function init(config) {}
/**
* Exits the program
* @param {number} code
* @returns {number}
*/
export function exit(code) {
return code + 1;
}
// index.ts
import { init, exit } from "./myPackage";
init({
debug: true,
url: "true",
});
exit(1);
index.ts
파일의 init
함수에 마우스를 올리면 js
에서 설정한 주석을 볼 수 있다.// init()의 주석
(alias) init(config: {
debug: boolean;
url: string;
}): void
import init
Initializes the project
@param config
@returns
ts
를 실행할 때마다 build
하는 것은 비효율적이다.package.json
의 scripts
에 옵션을 추가한다."start": "node build/index.js"
ts-node
설치npm i -D ts-node
: 빌드없이 ts
를 실행할 수 있다.nodemon
설치npm i nodemon
: 자동으로 커맨드를 실행한다.scripts
추가 : "dev": "nodemon --exec ts-node src/index.ts",
npm run dev
로 실행하면, src의 index.ts
를 실행한다.// index.ts
console.log("hi");
// terminal
> typescript@1.0.0 dev
> nodemon --exec ts-node src/index.ts
[nodemon] 2.0.19
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: ts,json
[nodemon] starting `ts-node src/index.ts`
hi
[nodemon] clean exit - waiting for changes before restart
// index.ts
console.log("bye") // hi -> bye
// terminal
[nodemon] restarting due to changes...
[nodemon] starting `ts-node src/index.ts`
bye
[nodemon] clean exit - waiting for changes before restart
DefinitelyTyped
은 npm에 있는 거의 모든 라이브러리의 정의가 담긴 거대한 github repository이다.npm i -D @types/{library}
로 설치한다.node.js
를 위한 타입이 필요하다면 npm i -D @types/node
를 입력한다.