Skip to content

Latest commit

ย 

History

History
291 lines (217 loc) ยท 10.9 KB

namespaces.md

File metadata and controls

291 lines (217 loc) ยท 10.9 KB

๋ชฉ์ฐจ (Table of Contents)

์†Œ๊ฐœ (Introduction)

์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„ (First steps)

๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ ์šฉํ•˜๊ธฐ (Namespacing)

ํŒŒ์ผ ๊ฐ„ ๋ถ„ํ•  (Splitting Across Files)

๋ณ„์นญ (Aliases)

๋‹ค๋ฅธ JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ž‘์—…ํ•˜๊ธฐ (Working with Other JavaScript Libraries)

์†Œ๊ฐœ (Introduction)

โ†ฅ ์œ„๋กœ

์ด ๊ฒŒ์‹œ๋ฌผ์—์„œ๋Š” TypeScript์—์„œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์„ ๊ฐ„๋žตํ•˜๊ฒŒ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„ (First steps)

โ†ฅ ์œ„๋กœ

์ด ํŽ˜์ด์ง€ ์ „์ฒด์—์„œ ์˜ˆ์ œ๋กœ ์‚ฌ์šฉํ•  ํ”„๋กœ๊ทธ๋žจ์„ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์›น ํŽ˜์ด์ง€์˜ ์–‘์‹์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์˜ ํ˜•์‹์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ„๋‹จํ•œ ๋ฌธ์ž์—ด ๊ฒ€์‚ฌ๊ธฐ ์„ธํŠธ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹จ์ผ ํŒŒ์ผ ๊ฒ€์‚ฌ๊ธฐ (Validators in a single file)

interface StringValidator {
    isAcceptable(s: string): boolean;
}

let lettersRegexp = /^[A-Za-z]+$/;
let numberRegexp = /^[0-9]+$/;

class LettersOnlyValidator implements StringValidator {
    isAcceptable(s: string) {
        return lettersRegexp.test(s);
    }
}

class ZipCodeValidator implements StringValidator {
    isAcceptable(s: string) {
        return s.length === 5 && numberRegexp.test(s);
    }
}

// ์‹œ๋„ํ•ด ๋ณผ ์ƒ˜ํ”Œ
let strings = ["Hello", "98052", "101"];

// ์‚ฌ์šฉํ•  ๊ฒ€์‚ฌ๊ธฐ
let validators: { [s: string]: StringValidator; } = {};
validators["ZIP code"] = new ZipCodeValidator();
validators["Letters only"] = new LettersOnlyValidator();

// ๊ฐ ๋ฌธ์ž์—ด์ด ๊ฐ ๊ฒ€์‚ฌ๊ธฐ๋ฅผ ํ†ต๊ณผํ–ˆ๋Š”์ง€ ํ‘œ์‹œ
for (let s of strings) {
    for (let name in validators) {
        let isMatch = validators[name].isAcceptable(s);
        console.log(`'${ s }' ${ isMatch ? "matches" : "does not match" } '${ name }'.`);
    }
}

๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ ์šฉํ•˜๊ธฐ (Namespacing)

๋” ๋งŽ์€ ๊ฒ€์‚ฌ๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋˜๋ฉด, ํƒ€์ž…์„ ์ถ”์ ํ•˜๊ณ  ๋‹ค๋ฅธ ๊ฐ์ฒด์™€ ์ด๋ฆ„ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ผ์ข…์˜ ๊ตฌ์กฐ ์ฒด๊ณ„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ „์—ญ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๋‹ค๋ฅธ ์ด๋ฆ„์„ ๋งŽ์ด ๋„ฃ๋Š” ๋Œ€์‹ , ๊ฐ์ฒด๋“ค์„ ํ•˜๋‚˜์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ ๊ฐ์‹ธ๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด ์˜ˆ์—์„œ๋Š” ๋ชจ๋“  ๊ฒ€์‚ฌ๊ธฐ ๊ด€๋ จ ๊ฐœ์ฒด๋ฅผ Validation์ด๋ผ๋Š” ํ•˜๋‚˜์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ ์˜ฎ๊ธฐ๊ฒ ์Šต๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์„œ ์ธํ„ฐํŽ˜์ด์Šค ๋ฐ ํด๋ž˜์Šค๊ฐ€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์™ธ๋ถ€์—์„œ๋„ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ ์–ธ๋ถ€์— export๋ฅผ ๋ถ™์ž…๋‹ˆ๋‹ค.
๋ฐ˜๋ฉด, ๋ณ€์ˆ˜ letterRegexp์™€ numberRegexp๋Š” ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์ด๋ฏ€๋กœ ์™ธ๋ถ€๋กœ ๋‚ด๋ณด๋‚ด์ง€ ์•Š์•„ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์™ธ๋ถ€ ์ฝ”๋“œ์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ ํ•˜๋‹จ์˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ, ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉ๋  ๋•Œ ํƒ€์ž…์˜ ์ด๋ฆ„์„ ๊ฒ€์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค (์˜ˆ: Validation.LetterOnlyValidator).

๋„ค์ž„์ŠคํŽ˜์ด์Šคํ™”๋œ ๊ฒ€์‚ฌ๊ธฐ (Namespaced Validators)

namespace Validation {
    export interface StringValidator {
        isAcceptable(s: string): boolean;
    }

    const lettersRegexp = /^[A-Za-z]+$/;
    const numberRegexp = /^[0-9]+$/;

    export class LettersOnlyValidator implements StringValidator {
        isAcceptable(s: string) {
            return lettersRegexp.test(s);
        }
    }

    export class ZipCodeValidator implements StringValidator {
        isAcceptable(s: string) {
            return s.length === 5 && numberRegexp.test(s);
        }
    }
}

// ์‹œ๋„ํ•ด ๋ณผ ์ƒ˜ํ”Œ
let strings = ["Hello", "98052", "101"];

// ์‚ฌ์šฉํ•  ๊ฒ€์‚ฌ๊ธฐ
let validators: { [s: string]: Validation.StringValidator; } = {};
validators["ZIP code"] = new Validation.ZipCodeValidator();
validators["Letters only"] = new Validation.LettersOnlyValidator();

// ๊ฐ ๋ฌธ์ž์—ด์ด ๊ฐ ๊ฒ€์‚ฌ๊ธฐ๋ฅผ ํ†ต๊ณผํ–ˆ๋Š”์ง€ ํ‘œ์‹œ
for (let s of strings) {
    for (let name in validators) {
        console.log(`"${ s }" - ${ validators[name].isAcceptable(s) ? "matches" : "does not match" } ${ name }`);
    }
}

ํŒŒ์ผ ๊ฐ„ ๋ถ„ํ•  (Splitting Across Files)

โ†ฅ ์œ„๋กœ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด, ์ฝ”๋“œ๋ฅผ ์—ฌ๋Ÿฌ ํŒŒ์ผ๋กœ ๋ถ„ํ• ํ•ด์•ผ ์œ ์ง€ ๋ณด์ˆ˜๊ฐ€ ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์ค‘ ํŒŒ์ผ ๋„ค์ž„์ŠคํŽ˜์ด์Šค (Multi-file namespaces)

โ†ฅ ์œ„๋กœ

์—ฌ๊ธฐ์„œ Validation ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์—ฌ๋Ÿฌ ํŒŒ์ผ๋กœ ๋ถ„ํ• ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ์ด ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์–ด๋„ ๊ฐ™์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ๊ณ  ๋งˆ์น˜ ํ•œ ๊ณณ์—์„œ ์ •์˜๋œ ๊ฒƒ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ ๊ฐ„ ์˜์กด์„ฑ์ด ์กด์žฌํ•˜๋ฏ€๋กœ, ์ฐธ์กฐ ํƒœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ํŒŒ์ผ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์•Œ๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ ์™ธ์— ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

Validation.ts
namespace Validation{
    export interface StringValidator{
        isAcceptable(s: string): boolean;
    }
}
LettersOnlyValidators.ts
/// <reference path="Validation.ts" />
namespace Validation {
    const lettersRegexp = /^[A-Za-z]+$/;
    export class LettersOnlyValidator implements StringValidator {
        isAcceptable(s: string) {
            return lettersRegexp.test(s);
        }
    }
}
ZipCodeValidators.ts
/// <reference path="Validation.ts" />
namespace Validation {
    const numberRegexp = /^[0-9]+$/;
    export class ZipCodeValidator implements StringValidator {
        isAcceptable(s: string) {
            return s.length === 5 && numberRegexp.test(s);
        }
    }
}
Test.ts
/// <reference path="Validation.ts" />
/// <reference path="LettersOnlyValidator.ts" />
/// <reference path="ZipCodeValidator.ts" />

// Some samples to try
let strings = ["Hello", "98052", "101"];

// Validators to use
let validators: { [s: string]: Validation.StringValidator; } = {};
validators["ZIP code"] = new Validation.ZipCodeValidator();
validators["Letters only"] = new Validation.LettersOnlyValidator();

// Show whether each string passed each validator
for (let s of strings) {
    for (let name in validators) {
        console.log(`"${ s }" - ${ validators[name].isAcceptable(s) ? "matches" : "does not match" } ${ name }`);
    }
}

ํŒŒ์ผ์ด ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ์œผ๋ฉด ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ๊ฐ€ ๋ชจ๋‘ ๋กœ๋“œ๋˜๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋จผ์ €, ๋ชจ๋“  ์ž…๋ ฅ ํŒŒ์ผ์„ ํ•˜๋‚˜์˜ JavaScript ์ถœ๋ ฅ ํŒŒ์ผ๋กœ ์ปดํŒŒ์ผํ•˜๊ธฐ ์œ„ํ•ด --outFile ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ๊ฒฐ ์ถœ๋ ฅ(concatenated output)์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

tsc --outFile sample.js Test.ts

์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํŒŒ์ผ์— ์žˆ๋Š” ์ฐธ์กฐ ํƒœ๊ทธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ถœ๋ ฅ ํŒŒ์ผ์„ ์ž๋™์œผ๋กœ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ํŒŒ์ผ์„ ๊ฐœ๋ณ„์ ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค:

tsc --outFile sample.js Validation.ts LettersOnlyValidator.ts ZipCodeValidator.ts Test.ts

๋˜๋Š” ํŒŒ์ผ๋ณ„ ์ปดํŒŒ์ผ (๊ธฐ๋ณธ๊ฐ’)์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ์ž…๋ ฅ ํŒŒ์ผ์„ ํ•˜๋‚˜์˜ JavaScript ํŒŒ์ผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ JS ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜๋Š” ๊ฒฝ์šฐ, ์›น ํŽ˜์ด์ง€์—์„œ ์ƒ์„ฑ๋œ ๊ฐœ๋ณ„ ํŒŒ์ผ์„ ์ ์ ˆํ•œ ์ˆœ์„œ๋กœ ๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•ด <script> ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

MyTestPage.html (์ธ์šฉ)
    <script src="Validation.js" type="text/javascript" />
    <script src="LettersOnlyValidator.js" type="text/javascript" />
    <script src="ZipCodeValidator.js" type="text/javascript" />
    <script src="Test.js" type="text/javascript" />

๋ณ„์นญ (Aliases)

โ†ฅ ์œ„๋กœ

๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ž‘์—…์„ ๋‹จ์ˆœํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ์ฒด์˜ ์ด๋ฆ„์„ ๋” ์งง๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด import q = x.y.z๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“ˆ์„ ๋กœ๋“œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” import x = require ("name") ๊ตฌ๋ฌธ๊ณผ ํ˜ผ๋™ํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด, ์ด ๊ตฌ๋ฌธ์€ ๋‹จ์ˆœํžˆ ํŠน์ • ์‹ฌ๋ฒŒ์— ๋ณ„์นญ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๊ฐ€์ ธ์˜ค๊ธฐ(์ผ๋ฐ˜์ ์œผ๋กœ ๋ณ„์นญ์ด๋ผ๊ณ  ํ•จ)๋Š” ๋ชจ๋“ˆ ๊ฐ€์ ธ์˜ค๊ธฐ์—์„œ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ํฌํ•จํ•˜์—ฌ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์‹๋ณ„์ž์— ๋Œ€ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

namespace Shapes {
    export namespace Polygons {
        export class Triangle { }
        export class Square { }
    }
}

import polygons = Shapes.Polygons;
let sq = new polygons.Square(); // 'new Shapes.Polygons.Square()'์™€ ๋™์ผ

require ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๋ช…์‹ฌํ•˜์„ธ์š”; ๋Œ€์‹  ๊ฐ€์ ธ์˜ค๋Š” ์‹ฌ๋ฒŒ์€ ์ •ํ•ด์ง„ ์ด๋ฆ„์œผ๋กœ ์ง์ ‘ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. var๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ, ๊ฐ€์ ธ์˜จ ์‹ฌ๋ฒŒ์˜ ํƒ€์ž… ๋ฐ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์˜๋ฏธ์— ๋Œ€ํ•ด์„œ๋„ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ, ๊ฐ’์˜ ๊ฒฝ์šฐ import๋Š” ์›๋ž˜ ์‹ฌ๋ฒŒ์™€ ๋ณ„๊ฐœ์˜ ์ฐธ์กฐ์ด๋ฏ€๋กœ ๋ณ„์นญ var์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ๋‚ด์šฉ์€ ์›๋ž˜ ๋ณ€์ˆ˜์— ๋ฐ˜์˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ž‘์—…ํ•˜๊ธฐ (Working with Other JavaScript Libraries)

โ†ฅ ์œ„๋กœ

TypeScript๋กœ ์ž‘์„ฑ๋˜์ง€ ์•Š์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ˜•ํƒœ๋ฅผ ์„ค๋ช…ํ•˜๋ ค๋ฉด, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์™ธ๋ถ€์— ์ œ๊ณตํ•˜๋Š” API๋ฅผ ์„ ์–ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์†Œ์ˆ˜์˜ ์ตœ์ƒ์œ„ ๊ฐ์ฒด๋งŒ ๋…ธ์ถœํ•˜๋ฏ€๋กœ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๊ตฌํ˜„์„ ์ •์˜ํ•˜์ง€ ์•Š์€ ์„ ์–ธ์„ "ambient"๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๊ฒƒ์€ .d.ts ํŒŒ์ผ์— ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. C/C++์— ์ต์ˆ™ํ•˜๋‹ค๋ฉด ์ด๋ฅผ .h ํŒŒ์ผ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Ambient ๋„ค์ž„์ŠคํŽ˜์ด์Šค (Ambient Namespaces)

โ†ฅ ์œ„๋กœ

๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” D3 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” d3์ด๋ผ๋Š” ์ „์—ญ ๊ฐ์ฒด์—์„œ ๊ธฐ๋Šฅ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” <script> ํƒœ๊ทธ๋ฅผ ํ†ตํ•ด ๋กœ๋“œ๋˜๋ฏ€๋กœ(๋ชจ๋“ˆ ๋กœ๋” ๋Œ€์‹ ) ํ˜•ํƒœ๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ์„ ์–ธํ•  ๋•Œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. TypeScript ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด ํ˜•ํƒœ๋ฅผ ๋ณด๊ธฐ ์œ„ํ•ด, ambient ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์„ ์–ธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

D3.d.ts (๊ฐ„๋‹จํ•œ ์ธ์šฉ)
declare namespace D3 {
    export interface Selectors {
        select: {
            (selector: string): Selection;
            (element: EventTarget): Selection;
        };
    }

    export interface Event {
        x: number;
        y: number;
    }

    export interface Base extends Selectors {
        event: Event;
    }
}

declare var d3: D3.Base;