Skip to content

Latest commit

Β 

History

History
114 lines (77 loc) Β· 6.28 KB

File metadata and controls

114 lines (77 loc) Β· 6.28 KB

μ†Œκ°œ (Introduction)

이 κΈ€μ—μ„œλŠ” TypeScriptμ—μ„œ λͺ¨λ“ˆκ³Ό λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜μ—¬ μ½”λ“œλ₯Ό κ΅¬μ„±ν•˜λŠ” λ‹€μ–‘ν•œ 방법을 κ°„λž΅ν•˜κ²Œ μ„€λͺ…ν•©λ‹ˆλ‹€. λ˜ν•œ λ„€μž„μŠ€νŽ˜μ΄μŠ€μ™€ λͺ¨λ“ˆμ— κ΄€ν•œ λͺ‡ κ°€μ§€ κ³ κΈ‰ μ£Όμ œμ™€ TypeScriptμ—μ„œ λ„€μž„μŠ€νŽ˜μ΄μŠ€μ™€ λͺ¨λ“ˆμ„ μ‚¬μš©ν•  λ•Œ ν”νžˆ λ§ˆμ£ΌμΉ˜λŠ” μœ„ν—˜μ„±μ„ μ‚΄νŽ΄λ³Ό κ²ƒμž…λ‹ˆλ‹€.

ES λͺ¨λ“ˆμ— λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ λͺ¨λ“ˆ λ¬Έμ„œλ₯Ό μ°Έκ³ ν•˜μ„Έμš”. TypeScript λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ λ„€μž„μŠ€νŽ˜μ΄μŠ€ λ¬Έμ„œλ₯Ό μ°Έκ³ ν•˜μ„Έμš”.

μ°Έκ³ : 맀우 였래된 λ²„μ „μ˜ TypeScript λ„€μž„μŠ€νŽ˜μ΄μŠ€λŠ” μ΄μ „μ˜ JavaScript λͺ¨λ“ˆ μ‹œμŠ€ν…œμΈ 'λ‚΄λΆ€ λͺ¨λ“ˆ'이라고 λΆˆλ ΈμŠ΅λ‹ˆλ‹€.

λͺ¨λ“ˆ μ‚¬μš©ν•˜κΈ° (Using Modules)

λͺ¨λ“ˆμ—λŠ” μ½”λ“œμ™€ μ„ μ–Έ λ‘˜ λ‹€ 포함될 수 μžˆμŠ΅λ‹ˆλ‹€.

λͺ¨λ“ˆμ€ λ˜ν•œ λͺ¨λ“ˆ λ‘œλ”(예: CommonJs/Require.js)에 λŒ€ν•œ μ˜μ‘΄μ„±μ΄λ‚˜ ES λͺ¨λ“ˆμ΄ μ§€μ›ν•˜λŠ” λŸ°νƒ€μž„μ„ κ°€μ§€κ³  μžˆμŠ΅λ‹ˆλ‹€. λͺ¨λ“ˆμ€ 더 λ‚˜μ€ μ½”λ“œ μž¬μ‚¬μš©μ„±μ„ μœ„ν•΄, κ°•λ ₯ν•œ 고립성과 λ²ˆλ“€λ§μ„ μœ„ν•œ ν–₯μƒλœ 도ꡬλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

λ˜ν•œ Node.js μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 경우 λͺ¨λ“ˆμ΄ 기본적인 방법이며, μ½”λ“œλ₯Ό κ΅¬μ‘°ν™”ν•˜λŠ” 데 μžˆμ–΄ ꢌμž₯ν•˜λŠ” μ ‘κ·Όλ²•μ΄λΌλŠ” 점을 μœ μ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

ECMAScript 2015λΆ€ν„°, λͺ¨λ“ˆμ€ μ–Έμ–΄μ—μ„œ 기본적으둜 λ‚΄μž¬ν•œ 뢀뢄이며, λͺ¨λ“  ν˜Έν™˜ μ—”μ§„ κ΅¬ν˜„μ€ λͺ¨λ“ˆμ„ 지원해야 ν•©λ‹ˆλ‹€. λ”°λΌμ„œ, μƒˆλ‘œμš΄ ν”„λ‘œμ νŠΈμ˜ 경우 μ½”λ“œλ₯Ό κ΅¬μ„±ν•˜λŠ” λ°©λ²•μœΌλ‘œ λͺ¨λ“ˆμ„ ꢌμž₯ν•©λ‹ˆλ‹€.

λ„€μž„μŠ€νŽ˜μ΄μŠ€ μ‚¬μš©ν•˜κΈ° (Using Namespaces)

λ„€μž„μŠ€νŽ˜μ΄μŠ€λŠ” μ½”λ“œλ₯Ό κ΅¬μ„±ν•˜λŠ” TypeScript만의 κ³ μœ ν•œ λ°©λ²•μž…λ‹ˆλ‹€. λ„€μž„μŠ€νŽ˜μ΄μŠ€λŠ” κ°„λ‹¨νžˆ μ „μ—­ λ„€μž„μŠ€νŽ˜μ΄μŠ€μ—μ„œ JavaScript 객체둜 이름 λΆ™μ—¬μ§‘λ‹ˆλ‹€. μ΄λŸ¬ν•œ 점 덕뢄에 λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό μ•„μ£Ό λ‹¨μˆœν•œ ꡬ쑰둜 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λͺ¨λ“ˆκ³Ό 달리, μ—¬λŸ¬ 개의 νŒŒμΌμ„ 포괄할 수 있으며, --outFile을 μ‚¬μš©ν•΄ μ—°κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ„€μž„μŠ€νŽ˜μ΄μŠ€λŠ” μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ½”λ“œλ₯Ό κ΅¬μ‘°ν™”ν•˜κΈ°μ— 쒋은 방법이며, λͺ¨λ“  μ˜μ‘΄μ„±μ€ HTML νŽ˜μ΄μ§€μ˜ <script> νƒœκ·Έλ‘œ ν¬ν•¨ν•©λ‹ˆλ‹€.

특히 λŒ€κ·œλͺ¨ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 경우, 이 방법은 λͺ¨λ“  μ „μ—­ λ„€μž„μŠ€νŽ˜μ΄μŠ€κ°€ μ˜€μ—Όλ˜λŠ” κ²½μš°μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ μ»΄ν¬λ„ŒνŠΈμ˜ μ˜μ‘΄μ„±μ„ μ‹λ³„ν•˜κΈ° νž˜λ“€κ²Œ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

λ„€μž„μŠ€νŽ˜μ΄μŠ€μ™€ λͺ¨λ“ˆμ˜ μœ„ν—˜μ„± (Pitfalls of Namespaces and Modules)

μ—¬κΈ°μ„œλŠ” λ„€μž„μŠ€νŽ˜μ΄μŠ€μ™€ λͺ¨λ“ˆμ„ μ‚¬μš©ν•  λ•Œ 자주 λ°œμƒν•˜λŠ” λ‹€μ–‘ν•œ μœ„ν—˜μ„±κ³Ό κ·Έ 해결책을 μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

/// <reference>λ₯Ό μ‚¬μš©ν•œ λͺ¨λ“ˆ

일반적인 μ‹€μˆ˜λŠ” λͺ¨λ“ˆ νŒŒμΌμ„ μ°Έμ‘°ν•˜κΈ° μœ„ν•΄ importλ¬Έ λŒ€μ‹  /// <reference ... /> ꡬ문을 μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 이 λ‘˜μ˜ 차이λ₯Ό μ΄ν•΄ν•˜κΈ° μœ„ν•΄, μš°μ„  import κ²½λ‘œμ— μœ„μΉ˜ν•œ λͺ¨λ“ˆμ— λŒ€ν•œ νƒ€μž… 정보λ₯Ό μ»΄νŒŒμΌλŸ¬κ°€ μ–΄λ–»κ²Œ μ°Ύμ•„λ‚΄λŠ”μ§€λ₯Ό 이해해야 ν•©λ‹ˆλ‹€. (예λ₯Ό λ“€μ–΄, import x from "...";, import x = require("..."); λ“± μ•ˆμ˜ ...)

μ»΄νŒŒμΌλŸ¬λŠ” .ts,Β .tsxλ₯Ό 찾은 λ‹€μŒ μ μ ˆν•œ κ²½λ‘œμ— μœ„μΉ˜ν•œΒ .d.tsλ₯Ό μ°ΎμŠ΅λ‹ˆλ‹€. λ§Œμ•½ νŠΉμ • νŒŒμΌμ„ μ°Ύμ§€ λͺ»ν•œλ‹€λ©΄, μ»΄νŒŒμΌλŸ¬λŠ” μ•°λΉ„μ–ΈνŠΈ λͺ¨λ“ˆ(ambient module) 선언을 탐색할 κ²ƒμž…λ‹ˆλ‹€. .d.ts νŒŒμΌμ•ˆμ— 이것듀을 μ„ μ–Έν•΄μ•Ό ν•œλ‹€λŠ” 점을 κΈ°μ–΅ν•˜μ„Έμš”.

  • myModules.d.ts

    // λͺ¨λ“ˆμ΄ μ•„λ‹Œ .d.ts 파일 λ˜λŠ” .ts 파일:
    declare module "SomeModule" {
        export function fn(): string;
    }
  • myOtherModule.ts

    /// <reference path="myModules.d.ts" />
    import * as m from "SomeModule";

μœ„μ˜ reference νƒœκ·ΈλŠ” μ•°λΉ„μ–ΈνŠΈ λͺ¨λ“ˆ(ambient module) 선언이 ν¬ν•¨λœ μ„ μ–Έ 파일의 μœ„μΉ˜λ₯Ό μ§€μ •ν•˜λŠ” 데 ν•„μš”ν•©λ‹ˆλ‹€. 이 방법은 μ—¬λŸ¬ TypeScript μƒ˜ν”Œμ—μ„œ μ‚¬μš©ν•˜λŠ” node.d.tsνŒŒμΌμ„ μ‚¬μš©ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.

λΆˆν•„μš”ν•œ λ„€μž„μŠ€νŽ˜μ΄μŠ€ (Needless Namespacing)

λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λ˜ ν”„λ‘œκ·Έλž¨μ„ λͺ¨λ“ˆλ‘œ λ³€κ²½ν•˜λ©΄, νŒŒμΌμ€ λ‹€μŒκ³Ό 같은 λͺ¨μŠ΅μ΄ 되기 μ‰½μŠ΅λ‹ˆλ‹€:

  • shapes.ts

    export namespace Shapes {
        export class Triangle { /* ... */ }
        export class Square { /* ... */ }
    }

μ΅œμƒμœ„ λͺ¨λ“ˆ ShapesλŠ” μ•„λ¬΄λŸ° 의미 없이 Triangleκ³Ό Square을 감싸고 μžˆμŠ΅λ‹ˆλ‹€. 이런 점은 λͺ¨λ“ˆ μ‚¬μš©μžμ—κ²Œ ν˜Όλ™κ³Ό μ§œμ¦μ„ μœ λ°œν•©λ‹ˆλ‹€:

  • shapeConsumer.ts

    import * as shapes from "./shapes";
    let t = new shapes.Shapes.Triangle(); // shapes.Shapes?

TypeScript λͺ¨λ“ˆμ˜ μ€‘μš”ν•œ νŠΉμ§• 쀑 ν•˜λ‚˜λŠ” μ„œλ‘œ λ‹€λ₯Έ 두 개의 λͺ¨λ“ˆμ΄ μ ˆλŒ€ 같은 μŠ€μ½”ν”„ μ•ˆμ— 이름을 μ œκ³΅ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” μ μž…λ‹ˆλ‹€. λͺ¨λ“ˆ μ‚¬μš©μžκ°€ μ–΄λ–€ 이름을 ν• λ‹Ήν• μ§€λ₯Ό κ²°μ •ν•˜κΈ° λ•Œλ¬Έμ—, λ„€μž„μŠ€νŽ˜μ΄μŠ€ λ‚΄λΆ€μ—μ„œ λ‚΄λ³΄λ‚΄λŠ” μ‹¬λ²Œμ„ 미리 감싸쀄 ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.

λͺ¨λ“ˆ λ‚΄μš©μ˜ λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό μ„€μ •ν•˜μ§€ μ•Šμ•„λ„ λ˜λŠ” 이유λ₯Ό λ‹€μ‹œ λ§ν•˜λ©΄, λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό μ§€μ •ν•˜λŠ” 일반적인 λͺ©μ μ€ ꡬ쑰의 논리적 그룹을 μ œκ³΅ν•˜κ³  이름 μΆ©λŒμ„ λ°©μ§€ν•˜κΈ° μœ„ν•¨μž…λ‹ˆλ‹€. λͺ¨λ“ˆ 파일이 이미 슀슀둜 논리적 그룹을 ν˜•μ„±ν•˜κ³  있기 λ•Œλ¬Έμ—, μ΅œμƒμœ„ 이름은 이λ₯Ό κ°€μ Έμ˜€λŠ” μ½”λ“œμ— μ˜ν•΄ μ •μ˜λ˜κ³ , λ‚΄λ³΄λ‚΄λŠ” 객체λ₯Ό μœ„ν•œ 좔가적인 λͺ¨λ“ˆ 계측을 μ‚¬μš©ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.

λ‹€μŒμ€ μˆ˜μ •λœ μ˜ˆμž…λ‹ˆλ‹€:

  • shapes.ts

    export class Triangle { /* ... */ }
    export class Square { /* ... */ }
  • shapeConsumer.ts

    import * as shapes from "./shapes";
    let t = new shapes.Triangle();

λͺ¨λ“ˆμ˜ νŠΈλ ˆμ΄λ“œ-μ˜€ν”„ (Trade-offs of Modules)

JS 파일과 λͺ¨λ“ˆμ΄ μΌλŒ€μΌ λŒ€μ‘μΈ κ²ƒμ²˜λŸΌ, TypeScriptλŠ” λͺ¨λ“ˆ μ†ŒμŠ€ 파일과 이 νŒŒμΌμ—μ„œ μƒμ„±λœ JS νŒŒμΌλ„ μΌλŒ€μΌ λŒ€μ‘μž…λ‹ˆλ‹€. μ΄λŸ¬ν•œ νŠΉμ„± λ•Œλ¬Έμ— μ–΄λ–€ λͺ¨λ“ˆ μ‹œμŠ€ν…œμ„ μ‚¬μš©ν•˜λŠλƒμ— λ”°λΌμ„œ μ—¬λŸ¬ λͺ¨λ“ˆ μ†ŒμŠ€ νŒŒμΌμ„ ν•©μΉ˜λŠ” μž‘μ—…μ΄ λΆˆκ°€λŠ₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, commonjs λ˜λŠ” umdλ₯Ό λŒ€μƒμœΌλ‘œ ν•˜λŠ” λ™μ•ˆμ—λŠ” outFile μ˜΅μ…˜μ„ μ‚¬μš©ν•  수 μ—†μ§€λ§Œ, TypeScript 1.8 이후뢀터, amd λ˜λŠ” systemλ₯Ό λŒ€μƒμœΌλ‘œ ν•˜λŠ” κ²½μš°μ—λŠ” outFile μ˜΅μ…˜μ„ μ‚¬μš©ν•  수 있게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.