ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Nodejs에서 Typescript 사용해보기!
    NodeJS 2020. 7. 14. 22:50
    728x90

    Nodejs에서 Typescript 사용해보기!

    nodejs를 하면서 Typescript에 대하여 어려번 들었습니다.

    기본적으로 nosejs에 대한 개발을 REPL 기반으로 하고 있습니다.

    TDD를 하기 위해서는 타입에 대한 검증등 많은 것들을 처리 해야 하는데요. 이는 Typescript와 더 잘 맞습니다.

    한번 사용해보기 위해서 nodejs에서 Typescript를 사용하는 방법을 설명드리겠습니다.

    Typescript 사용해 보기

    평소에는 npm을 사용하지만, 이번에는 yarn을 사용해보려고 합니다.

    프로젝트 생성하기

    먼저 프로젝트 디렉토리를 생성하고 yarn 명령어를 이용해서 초기화 합니다.

    $ mkdir learn-typescript
    $ cd learn-typescript
    $ yarn init -y

    Typescript 사용을 위한 모듈 설치하기

    • typescript : Typescript 라이브러리
    • ts-node : node에서 Typescript를 사용하기 위한 라이브러리
    $ yarn add typescript ts-node

    Typescript 설정 파일 생성하기

    타입스크립트에 대한 정보를 가지고 있는 설정파일을 생성합니다.

    $ yarn run tsc --init

    실행을 하면 디렉토리에 tsconfig.json 파일이 생성됩니다.

    해당 파일의 내용은 아래와 같습니다.

    {
      "compilerOptions": {
        /* Visit https://aka.ms/tsconfig.json to read more about this file */
    
        /* Basic Options */
        // "incremental": true,                   /* Enable incremental compilation */
        "target": "es2016" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */,
        "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */,
        // "lib": [],                             /* Specify library files to be included in the compilation. */
        // "allowJs": true,                       /* Allow javascript files to be compiled. */
        // "checkJs": true,                       /* Report errors in .js files. */
        // "jsx": "preserve",                     /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
        // "declaration": true,                   /* Generates corresponding '.d.ts' file. */
        // "declarationMap": true,                /* Generates a sourcemap for each corresponding '.d.ts' file. */
        // "sourceMap": true,                     /* Generates corresponding '.map' file. */
        // "outFile": "./",                       /* Concatenate and emit output to single file. */
        "outDir": "./dist/" /* Redirect output structure to the directory. */,
        // "rootDir": "./",                       /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
        // "composite": true,                     /* Enable project compilation */
        // "tsBuildInfoFile": "./",               /* Specify file to store incremental compilation information */
        // "removeComments": true,                /* Do not emit comments to output. */
        // "noEmit": true,                        /* Do not emit outputs. */
        // "importHelpers": true,                 /* Import emit helpers from 'tslib'. */
        // "downlevelIteration": true,            /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
        // "isolatedModules": true,               /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
    
        /* Strict Type-Checking Options */
        "strict": true /* Enable all strict type-checking options. */,
        // "noImplicitAny": true,                 /* Raise error on expressions and declarations with an implied 'any' type. */
        // "strictNullChecks": true,              /* Enable strict null checks. */
        // "strictFunctionTypes": true,           /* Enable strict checking of function types. */
        // "strictBindCallApply": true,           /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
        // "strictPropertyInitialization": true,  /* Enable strict checking of property initialization in classes. */
        // "noImplicitThis": true,                /* Raise error on 'this' expressions with an implied 'any' type. */
        // "alwaysStrict": true,                  /* Parse in strict mode and emit "use strict" for each source file. */
    
        /* Additional Checks */
        // "noUnusedLocals": true,                /* Report errors on unused locals. */
        // "noUnusedParameters": true,            /* Report errors on unused parameters. */
        // "noImplicitReturns": true,             /* Report error when not all code paths in function return a value. */
        // "noFallthroughCasesInSwitch": true,    /* Report errors for fallthrough cases in switch statement. */
    
        /* Module Resolution Options */
        // "moduleResolution": "node",            /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
        // "baseUrl": "./",                       /* Base directory to resolve non-absolute module names. */
        // "paths": {},                           /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
        // "rootDirs": [],                        /* List of root folders whose combined content represents the structure of the project at runtime. */
        // "typeRoots": [],                       /* List of folders to include type definitions from. */
        // "types": [],                           /* Type declaration files to be included in compilation. */
        // "allowSyntheticDefaultImports": true,  /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
        "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */,
        // "preserveSymlinks": true,              /* Do not resolve the real path of symlinks. */
        // "allowUmdGlobalAccess": true,          /* Allow accessing UMD globals from modules. */
    
        /* Source Map Options */
        // "sourceRoot": "",                      /* Specify the location where debugger should locate TypeScript files instead of source locations. */
        // "mapRoot": "",                         /* Specify the location where debugger should locate map files instead of generated locations. */
        // "inlineSourceMap": true,               /* Emit a single file with source maps instead of having a separate file. */
        // "inlineSources": true,                 /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
    
        /* Experimental Options */
        // "experimentalDecorators": true,        /* Enables experimental support for ES7 decorators. */
        // "emitDecoratorMetadata": true,         /* Enables experimental support for emitting type metadata for decorators. */
    
        /* Advanced Options */
        "skipLibCheck": true /* Skip type checking of declaration files. */,
        "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */
      }
    }

    물론 명령어 없이 추가해도 됩니다.

    Typescript 컴파일

    다음 명령어로 .ts 파일을 컴파일 하여 .js 파일로 변환합니다.

    $ yarn run tsc

    컴파일 후 기본적으로 같은 디렉토리에 .js파일로 생성됩니다.

    tsconfig.json 파일의 outDir 값을 이용해서 다른 디렉토리에 생성되도록 변경이 가능합니다.

    nodejs에서 Typescript 실행하기

    매번 컴파일을 하지 않고 ts-node 명령어를 이용해서 실행할 수 있습니다.

    # run ts file
    $ yarn run ts-node ./src/index.ts

    여기까지 기본적은 Typescript를 nodejs에서 사용하는 명령어를 확인하였습니다.

    Typescript에 대하여 자세히 알고 싶다면 TypeScript Documentation 문서를 확인하면 됩니다. :)

    마지막으로 마틴 아저씨가 REPL로 개발한 경험을 블로그에 올리셨습니다.

    So I’ve learned my lesson. REPL driven development feels easier and faster than TDD; but it is not. Next time, it’s back to TDD for me.
    
    내 맘대로 직역 :
    
    내가 배운 교훈은 REPL개발은 TDD에 비해 쉽고 빠르게 보이지만, 실제로는 그렇지 않다. 여러 부분에서 더 많은 비용을 들이게 된다.
    그래서 나는 TDD를 다시 사용한다.

    nodejs에서 명확히 구조화된 프로그램 작성을 위해서는 Typescript를 사용하는 것을 추천합니다. :)

    참고자료

    728x90
Designed by Tistory.