์•ˆ๋…•ํ•˜์„ธ์š”. IT ์—˜๋„๋ผ๋„ ์— ์˜ค์‹  ๊ฒƒ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.
๊ธ€์„ ์“ฐ๋Š” ๊ฒƒ์€ ๊ท€์ฐฎ์ง€๋งŒ ๋‹ค์‹œ ์ฐพ์•„๋ณด๋Š” ๊ฒƒ์€ ๋” ๊ท€์ฐฎ์Šต๋‹ˆ๋‹ค.
์™„์ „ํ•œ ๋‚˜๋งŒ์˜ ๊ฒƒ์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ง€์‹์„ ์ฐจ๊ณก์ฐจ๊ณก ์ €์žฅํ•ด ๋ณด์•„์š”.   ํฌ์ŠคํŒ… ๋‘˜๋Ÿฌ๋ณด๊ธฐ โ–ผ

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ (TypeScript)

[TypeScript] module, import, export, declare ๊ฐœ๋… ์ •๋ฆฌ

ํ”ผ๊ทธ๋ธŒ๋ผ๋” 2020. 12. 30. 14:24

๐Ÿ‘‰ ๋ชจ๋“ˆ(Module)์ด๋ž€?

  • import ๋˜๋Š” export๊ฐ€ ์žˆ๋Š” ํŒŒ์ผ์€ ๋ชจ๋“ˆ(Module)๋กœ ์ทจ๊ธ‰์ด ๋œ๋‹ค.
  • ์ฆ‰, ์™ธ๋ถ€์—์„œ๋Š” ์ง์ ‘์ ์œผ๋กœ ๋ชจ๋“ˆ์„ ๋ถˆ๋Ÿฌ์˜ค์ง€ ์•Š๋Š” ์ด์ƒ ๊ทธ ๋ชจ๋“ˆ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
  • import๋Š” ๋ชจ๋“ˆ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ, export๋Š” ๋ชจ๋“ˆ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ด๋ณด๋‚ผ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

 

๐Ÿ‘‰ import, export ๋ฐ์ดํ„ฐ : ๋ณ€์ˆ˜, ์ƒ์ˆ˜, ํ•จ์ˆ˜, ํด๋ž˜์Šค, ํƒ€์ž…, ๋„ค์ž„์ŠคํŽ˜์ด์Šค

  • TypeScript ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ชจ๋“ˆ ๋กœ๋”๋ฅผ ํ†ตํ•ด ์‹ค์ œ๋กœ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฑด ์˜ค๋กœ์ง€ ํƒ€์ž… ์ •๋ณด๋ฟ์ด๋‹ค.
  • ๋ณ€์ˆ˜, ์ƒ์ˆ˜, ํ•จ์ˆ˜, ํด๋ž˜์Šค : JS ๋ชจ๋“ˆ ๋กœ๋” ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผ์ด ๋œ๋‹ค.
  • ํƒ€์ž… : JS ์ฝ”๋“œ๋กœ๋Š” ์ปดํŒŒ์ผ ๋˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰, JS ์ฝ”๋“œ์—์„œ๋Š” ์‚ญ์ œ๋œ๋‹ค.
  • ๋„ค์ž„์ŠคํŽ˜์ด์Šค : JS ์ผ๋ฐ˜ ๊ฐ์ฒด๋กœ ์ปดํŒŒ์ผ ๋œ๋‹ค. IIFE ํ•จ์ˆ˜์— ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ๊ทธ ํ•จ์ˆ˜๋ฅผ ์ฆ‰์‹œ ํ˜ธ์ถœํ•˜๋Š” ์‹์œผ๋กœ ์ปดํŒŒ์ผ ๋œ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์™ธ๋ถ€์—์„  ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด๋ถ€๋ฅผ ๋ณผ ์ˆ˜ ์—†๋Š”๋ฐ, ์ด๋Ÿฌํ•œ ๋™์ž‘์€ IIFE ํ•จ์ˆ˜ ๋‚ด์—์„œ ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ฉฐ ๊ฐ์ข… ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” ๋ฐฉ์‹์„ ํ†ตํ•ด ๊ตฌํ˜„ํ•˜๊ฒŒ ๋œ๋‹ค. ๋งŒ์•ฝ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์™ธ๋ถ€์—์„œ๋„ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜๊ณ  ์‹ถ์€ ๋ฐ์ดํ„ฐ(๋ณ€์ˆ˜, ์ƒ์ˆ˜, ํ•จ์ˆ˜, ํด๋ž˜์Šค, ๋„ค์ž„์ŠคํŽ˜์ด์Šค)๊ฐ€ ์žˆ๋‹ค๋ฉด export๋ฅผ ์‚ฌ์šฉํ•˜์ž.
    // TypeScript
    namespace N1 {
        export let a: string = 'a';
        let b: string = 'b';
        console.log(a);
        console.log(b);
    
        export namespace N2 {
            export let c: string = 'c';
            let d: string = 'd';
            console.log(c);
            console.log(d);
        }
    }
    
    // Compiled JavaScript
    "use strict";
    var N1;
    (function (N1) {
        N1.a = 'a';
        let b = 'b';
        console.log(N1.a);
        console.log(b);
    
        let N2;
        (function (N2) {
            N2.c = 'c';
            let d = 'd';
            console.log(N2.c);
            console.log(d);
        })(N2 = N1.N2 || (N1.N2 = {}));
    })(N1 || (N1 = {}));

 

๐Ÿ‘‰ declare ํ‚ค์›Œ๋“œ

  • ๋ณ€์ˆ˜, ์ƒ์ˆ˜, ํ•จ์ˆ˜, ๋˜๋Š” ํด๋ž˜์Šค๊ฐ€ ์–ด๋”˜๊ฐ€์— ์ด๋ฏธ ์„ ์–ธ๋˜์–ด ์žˆ์Œ์„ ์•Œ๋ฆฐ๋‹ค.
  • ์ฆ‰, JS ์ฝ”๋“œ๋กœ๋Š” ์ปดํŒŒ์ผ ๋˜์ง€ ์•Š๊ณ , TypeScript ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ํƒ€์ž… ์ •๋ณด๋ฅผ ์•Œ๋ฆฌ๊ธฐ๋งŒ ํ•œ๋‹ค.
  • ํƒ€์ž…์˜ ๊ฒฝ์šฐ ์–ด์ฐจํ”ผ JS ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผ ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ declare ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
  • declare ๋ธ”๋ก (declare namespace, declare module, declare global)
    • ์•ฐ๋น„์–ธํŠธ ์ปจํ…์ŠคํŠธ(Ambient Context)๋กœ ์ •์˜๋˜๋Š” ์˜์—ญ์ด๋‹ค.
    • ์ด ์˜์—ญ ์•ˆ์—์„œ๋Š” declare ํ‚ค์›Œ๋“œ๊ฐ€ ๊ธฐ๋ณธ์œผ๋กœ ๋ถ™๋Š”๋‹ค. ์ฆ‰ ๊ตณ์ด ๋˜ ๋ถ™์—ฌ์ค„ ํ•„์š”๊ฐ€ ์—†๋‹ค.
    • ๋˜ํ•œ ์ด ์˜์—ญ ์•ˆ์—์„œ๋Š” ์„ ์–ธ ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ ์ผ๋ฐ˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์—†๋‹ค.
    • declare namespace ABC : ์›๋ž˜๋Œ€๋กœ๋ผ๋ฉด JS ์ผ๋ฐ˜ ๊ฐ์ฒด๋กœ ์ปดํŒŒ์ผ ๋˜๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฒ ์ง€๋งŒ, declare ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์—ฌ์คŒ์œผ๋กœ์จ JS ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผ ๋˜์ง€ ์•Š๊ฒŒ ํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ๋ช‡๋ช‡ ํƒ€์ž…๋“ค์„ ์˜๋ฏธ์ ์œผ๋กœ ๋ฌถ๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•œ๋‹ค. ์ด ๋ธ”๋ก์€ ์•ฐ๋น„์–ธํŠธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ํ˜น์€ ๋‚ด๋ถ€ ๋ชจ๋“ˆ์ด๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค.
    • declare module "ABC" : ์•ฐ๋น„์–ธํŠธ ๋ชจ๋“ˆ ์„ ์–ธ(Ambient Module Declaration) ํŒŒ์ผ์— ์ž‘์„ฑํ•˜๋Š” ๋ธ”๋ก์œผ๋กœ, ์•ฐ๋น„์–ธํŠธ ๋ชจ๋“ˆ ํ˜น์€ ์™ธ๋ถ€ ๋ชจ๋“ˆ์ด๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค. ์ด๋Ÿฌํ•œ ์•ฐ๋น„์–ธํŠธ ๋ชจ๋“ˆ ์„ ์–ธ ํŒŒ์ผ์€ ์ปดํŒŒ์ผ ๋Œ€์ƒ์— ํฌํ•จ๋˜๊ธฐ๋งŒ ํ•œ๋‹ค๋ฉด(์˜ˆ๋ฅผ ๋“ค์–ด Triple Slash ๋””๋ ‰ํ‹ฐ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋“ ๊ฐ€ ํ•ด์„œ) ๊ทธ๊ณณ์— ์„ ์–ธ๋œ ๋ชจ๋“ˆ(์—ฌ๊ธฐ์„œ๋Š” ABC)์˜ ํƒ€์ž… ์ •๋ณด๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ๋ฌผ๋ก  ์ด ๋ธ”๋ก๋„ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ export๋ฅผ ๋ถ™์ธ ํ•„๋“œ๋งŒ ์™ธ๋ถ€์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.
    • declare global : ๋ชจ๋“ˆ ํŒŒ์ผ์—์„œ๋„ ์ „์—ญ ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์„ ์–ธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ์ „์—ญ ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์€ ํ•ด๋‹น ์„ ์–ธ์˜ ์ฐธ์กฐ๋ฅผ ์œ„ํ•ด ๋ณ„๋„์˜ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์ฝ”๋“œ๊ฐ€ ํ•„์š” ์—†๋‹ค๋Š” ๋œป์ด๋‹ค. ์ฐธ๊ณ ๋กœ ์ด ๋ธ”๋ก์€ ์˜ค๋กœ์ง€ declare module ๋ธ”๋ก ์•ˆ์—์„œ๋งŒ ์ค‘์ฒฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

๐Ÿ‘‰ .d.ts ํŒŒ์ผ (์„ ์–ธ ์ฝ”๋“œ๋งŒ ๋‹ด๊ธด ํŒŒ์ผ)

  • ๊ตฌํ˜„๋ถ€๊ฐ€ ์•„๋‹Œ ์„ ์–ธ๋ถ€๋งŒ์„ ์ž‘์„ฑํ•˜๋Š” ์šฉ๋„์˜ ํŒŒ์ผ์„ ์˜๋ฏธํ•œ๋‹ค.
  • JS ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผ ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • skipLibCheck ํ”„๋กœํผํ‹ฐ๊ฐ€ false๋ผ๋ฉด ๋‹ค์Œ ๊ทœ์น™๋“ค์„ ๊ฐ•์ œํ•œ๋‹ค. (true์—ฌ๋„ ์ง€ํ‚ค๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.)
    • ์„ ์–ธ ์ฝ”๋“œ๋งŒ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•˜๊ณ , ์ผ๋ฐ˜ ์ฝ”๋“œ๋Š” ์ž‘์„ฑํ•  ์ˆ˜ ์—†๋‹ค.
    • ๋”ฐ๋ผ์„œ ์ตœ์ƒ์œ„์— ์กด์žฌํ•˜๋Š” ๋ณ€์ˆ˜, ์ƒ์ˆ˜, ํ•จ์ˆ˜, ํด๋ž˜์Šค, ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ์„ ์–ธ ์•ž์—๋Š” ๋ฐ˜๋“œ์‹œ declare ํ˜น์€ export๊ฐ€ ๋ถ™์–ด์•ผ ํ•œ๋‹ค.
  • ์ด ํŒŒ์ผ์— ์ž‘์„ฑ๋˜๋Š” declare namespace ๋ธ”๋ก๊ณผ declare module ๋ธ”๋ก์˜ ํ•„๋“œ๋“ค์—๋Š” export ํ‚ค์›Œ๋“œ๊ฐ€ ๊ธฐ๋ณธ์œผ๋กœ ๋ถ™๋Š”๋‹ค. ์ฆ‰ ๊ตณ์ด ๋˜ ๋ถ™์—ฌ์ค„ ํ•„์š”๊ฐ€ ์—†๋‹ค.

 

๐Ÿ‘‰ export = & import = require()

  • CommonJS์™€ AMD๋ผ๋Š” ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์—์„œ๋Š” exports ๊ฐ์ฒด๋ผ๋Š” ๊ฐœ๋…์ด ์กด์žฌํ•œ๋‹ค.
  • exports๋Š” ๋ชจ๋“ˆ๋กœ๋ถ€ํ„ฐ ๋‚ด๋ณด๋‚ด์ง€๋Š” ๋ฐ์ดํ„ฐ๋“ค์„ ๋‹ด๊ณ  ์žˆ๋Š” ํ•˜๋‚˜์˜ ๊ฐ์ฒด์ด๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  exports ๊ฐ์ฒด๋ฅผ ๋˜ ๋‹ค๋ฅธ ์ปค์Šคํ…€ ๊ฐ์ฒด๋กœ ๋Œ€์ฒดํ•˜๋Š” ๊ฒƒ๋„ ์ง€์›ํ•œ๋‹ค.
  • ์‚ฌ์‹ค export default๊ฐ€ ์ด ๋™์ž‘์„ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ฒƒ์ด์ง€๋งŒ, ์ด ๋‘˜์€ ํ˜ธํ™˜์„ฑ์ด ์ข‹์ง€ ์•Š๋‹ค.
  • ๊ทธ๋ž˜์„œ TypeScript๋Š” CommonJS์™€ AMD์—์„œ exports ๊ฐ์ฒด๋ฅผ ๋˜ ๋‹ค๋ฅธ ์ปค์Šคํ…€ ๊ฐ์ฒด๋กœ ๋Œ€์ฒดํ•˜๋Š” ๋™์ž‘์„ ์œ ์‚ฌํ•˜๊ฒŒ ๋”ฐ๋ผํ•  ์ˆ˜ ์žˆ๋„๋ก export = ๋ฌธ๋ฒ•์„ ์ง€์›ํ•˜๊ณ  ์žˆ๋‹ค.
  • export = ๋ฌธ๋ฒ•์€ ๋ชจ๋“ˆ๋กœ๋ถ€ํ„ฐ ๋‚ด๋ณด๋‚ด์งˆ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋ฅผ ์ง€์ •ํ•œ๋‹ค. ๊ทธ๊ฒƒ์€ ํด๋ž˜์Šค์ผ ์ˆ˜๋„ ์žˆ๊ณ , ์ธํ„ฐํŽ˜์ด์Šค์ผ ์ˆ˜๋„ ์žˆ๊ณ , ๋„ค์ž„์ŠคํŽ˜์ด์Šค์ผ ์ˆ˜๋„ ์žˆ๊ณ , ์—ด๊ฑฐํ˜•์ผ ์ˆ˜๋„ ์žˆ๋‹ค.
  • export = ๋ฌธ๋ฒ•์œผ๋กœ ๊ฐ์ฒด๋ฅผ ๋‚ด๋ณด๋‚ธ ๋ชจ๋“ˆ์˜ ๊ฒฝ์šฐ ๋ฐ˜๋“œ์‹œ import module = require("module") ๋ฌธ๋ฒ•์œผ๋กœ๋งŒ ๋ถˆ๋Ÿฌ์™€์•ผ ํ•œ๋‹ค.
  • ๋‹จ, module ํ”„๋กœํผํ‹ฐ๊ฐ€ esnext์ด๋ฉด ์ด ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋ฉฐ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๋‹ค๋งŒ .d.ts ํŒŒ์ผ์—์„œ๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค. (๊ทธ ์ด์œ ๋Š” ์•„์ง ํŒŒ์•…ํ•˜์ง€ ๋ชปํ–ˆ๋‹ค.)

 

๐Ÿ‘‰ export as namespace

  • .d.ts ํŒŒ์ผ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ๋ฒ•์ด๋‹ค.
  • export ๋˜๋Š” ๋ฐ์ดํ„ฐ๋“ค์„ ํ•˜๋‚˜์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ ๋ฌถ์–ด์„œ export ์‹œํ‚ค๋Š” ๋ฌธ๋ฒ•์ด๋‹ค.
  • ๊ทธ๋ ‡๊ฒŒ export ๋˜๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ์ „์—ญ ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ฆ‰ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์ฝ”๋“œ๊ฐ€ ํ•„์š” ์—†๋‹ค.