μ©μ΄μ λν μ°Έκ³ μ¬ν: TypeScript 1.5μ λͺ μΉμ΄ λ³κ²½λμμ΅λλ€.
"λ΄λΆ λͺ¨λ"μ μ΄μ "λ€μμ€νμ΄μ€"μ λλ€.
"μΈλΆ λͺ¨λ"μ ECMAScript 2015μ μ©μ΄μ λ§κ² κ°λ¨ν "λͺ¨λ"μ λλ€ (μ¦ λͺ¨λ X { λ νμ¬ μ νΈλλ λ€μμ€νμ΄μ€ X { μ λμΌν©λλ€).
μ΄ κ²μλ¬Όμ TypeScriptμ λ€μμ€νμ΄μ€(μ΄μ μ "λ΄λΆ λͺ¨λ")λ₯Ό μ¬μ©νμ¬ μ½λλ₯Ό ꡬμ±νλ λ€μν λ°©λ²μ κ°λ΅νκ² μ€λͺ
ν©λλ€.
μ©μ΄μ λν΄ μΈκΈν λ "λ΄λΆ(internal) λͺ¨λ"μ μ΄μ "λ€μμ€νμ΄μ€"λ‘ μΈκΈλ©λλ€.
λ λ΄λΆ λͺ¨λμ μ μΈν λ module
ν€μλκ° μ¬μ©λ κ³³μ΄λΌλ©΄ μ΄λμμλ namespace
ν€μλλ₯Ό λμ μ¬μ©ν μ μμ΅λλ€.
λΉμ·ν μ΄λ¦μ μ©μ΄λ‘ μ€λ²λ‘λν¨μΌλ‘μ¨ μλ‘μ΄ μ¬μ©μμκ² μ£Όλ νΌλμ λ°©μ§ν©λλ€.
λ¨Όμ μ΄ νμ΄μ§μ μμ λ‘ μ¬μ©ν νλ‘κ·Έλ¨μμλΆν° μμν΄λ³΄κ² μ΅λλ€.
μΉ νμ΄μ§μ μμμ λν μ¬μ©μ μ
λ ₯μ νμΈνκ±°λ μΈλΆμμ μ 곡νλ λ°μ΄ν° νμΌμ νμμ νμΈνκΈ° μν΄ μμ±ν μ μλ κ°λ¨ν λ¬Έμμ΄ μ ν¨μ± κ²μ¬κΈ°λ₯Ό μμ±νμ΅λλ€.
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"];
// μ¬μ©ν Validators
let validators: { [s: string]: StringValidator; } = {};
validators["ZIP code"] = new ZipCodeValidator();
validators["Letters only"] = new LettersOnlyValidator();
// κ° λ¬Έμμ΄μ΄ Validatorλ₯Ό ν΅κ³Όνλμ§ μ¬λΆλ₯Ό λ³΄μ¬ μ€λλ€.
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 }'.`);
}
}
Validatorλ₯Ό λ μΆκ°ν¨μ λ°λΌ νμ
μ μΆμ νκ³ λ€λ₯Έ κ°μ²΄μμ μ΄λ¦ μΆ©λμ λν΄ κ±±μ νμ§ μμ μ μλ μΌμ’
μ μ‘°μ§ μ²΄κ³λ₯Ό μν κ²μ
λλ€.
μ μ λ€μμ€νμ΄μ€μ λ€λ₯Έ μ΄λ¦μ λ§μ΄ μΆκ°νλ λμ κ°μ²΄λ₯Ό λ€μμ€νμ΄μ€λ‘ λ§λ¬΄λ¦¬ν©μλ€.
μ΄ μμ μμλ λͺ¨λ validator κ΄λ ¨ μν°ν°λ₯Ό Validation
λΌλ λ€μμ€νμ΄μ€λ‘ μ΄λν©λλ€.
μ¬κΈ°μ μΈν°νμ΄μ€μ ν΄λμ€λ₯Ό λ€μμ€νμ΄μ€ μΈλΆμμ λ³Ό μ μκΈ°λ₯Ό μνκΈ° λλ¬Έμ export
λ₯Ό 머리λ§μ λΆμ
λλ€.
λ°λλ‘ λ³μ lettersRegexp
μ numberRegexp
λ ꡬν μΈλΆ μ¬νμ΄λ―λ‘ λ
ΈμΆλμ§ μμ μνλ‘ λ¨μμμ΄ λ€μμ€νμ΄μ€ μΈλΆμ μ½λμλ 보μ΄μ§ μμ΅λλ€.
νμΌμ μλμͺ½μ μλ ν
μ€νΈ μ½λμμ (μ: Validation.LettersOnlyValidator
)μ κ°μ΄ λ€μμ€νμ΄μ€ μΈλΆμμ μ¬μ©ν κ²½μ° νμ
μ μ΄λ¦μ νμΈν΄μΌ ν©λλ€.
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"];
// μ¬μ©ν Validators
let validators: { [s: string]: Validation.StringValidator; } = {};
validators["ZIP code"] = new Validation.ZipCodeValidator();
validators["Letters only"] = new Validation.LettersOnlyValidator();
// κ° λ¬Έμμ΄μ΄ Validatorλ₯Ό ν΅κ³Όνλμ§ μ¬λΆλ₯Ό λ³΄μ¬ μ€λλ€.
for (let s of strings) {
for (let name in validators) {
console.log(`"${ s }" - ${ validators[name].isAcceptable(s) ? "matches" : "does not match" } ${ name }`);
}
}
μ ν리μΌμ΄μ μ΄ μ¦κ°ν¨μ λ°λΌ μ½λλ₯Ό μ¬λ¬ νμΌλ‘ λλμ΄ μ μ§ λ³΄μνκΈ° μ½κ² λ§λ€λ €κ³ ν©λλ€.
μ¬κΈ°μ Validation
λ€μμ€νμ΄μ€λ₯Ό λ§μ νμΌλ€λ‘ λλ κ²μ
λλ€.
νμΌμ λ³κ°μ΄μ§λ§ κ°κ° λμΌν λ€μμ€νμ΄μ€μ κΈ°μ¬ν μ μμΌλ©° λͺ¨λ νμΌμ΄ νκ³³μμ μ μλ κ²μ²λΌ μ¬μ©ν μ μμ΅λλ€.
νμΌ κ° μμ‘΄μ±μ΄ μκΈ° λλ¬Έμ μ»΄νμΌλ¬μκ² νμΌλ€ κ°μ κ΄κ³λ₯Ό μλ €μ£Όλ μ°Έμ‘° νκ·Έλ₯Ό μΆκ°ν©λλ€.
ν
μ€νΈ μ½λλ λ³κ²½λμ§ μμ΅λλ€.
namespace Validation {
export interface StringValidator {
isAcceptable(s: string): boolean;
}
}
/// <reference path="Validation.ts" />
namespace Validation {
const lettersRegexp = /^[A-Za-z]+$/;
export class LettersOnlyValidator implements StringValidator {
isAcceptable(s: string) {
return lettersRegexp.test(s);
}
}
}
/// <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);
}
}
}
/// <reference path="Validation.ts" />
/// <reference path="LettersOnlyValidator.ts" />
/// <reference path="ZipCodeValidator.ts" />
// μνμ© μν
let strings = ["Hello", "98052", "101"];
// μ¬μ©ν Validators
let validators: { [s: string]: Validation.StringValidator; } = {};
validators["ZIP code"] = new Validation.ZipCodeValidator();
validators["Letters only"] = new Validation.LettersOnlyValidator();
// κ° λ¬Έμμ΄μ΄ Validatorλ₯Ό ν΅κ³Όνλμ§ μ¬λΆλ₯Ό λ³΄μ¬ μ€λλ€.
for (let s of strings) {
for (let name in validators) {
console.log(`"${ s }" - ${ validators[name].isAcceptable(s) ? "matches" : "does not match" } ${ name }`);
}
}
μ¬λ¬ νμΌμ΄ ν¬ν¨λλ©΄ μ»΄νμΌλ λͺ¨λ μ½λλ₯Ό λ‘λν΄μΌ ν©λλ€.
μ΄ μμ
μλ λ κ°μ§ λ°©λ²μ΄ μμ΅λλ€.
λ¨Όμ --outFile
μ μ¬μ©νμ¬ λͺ¨λ μ
λ ₯ νμΌμ λ¨μΌ JavaScript μΆλ ₯ νμΌλ‘ μ»΄νμΌ ν μ μμ΅λλ€:
tsc --outFile sample.js Test.ts
μ»΄νμΌλ¬λ νμΌμ μλ μ°Έμ‘° νκ·Έλ₯Ό κΈ°λ°μΌλ‘ μΆλ ₯ νμΌμ μλμΌλ‘ μ λ ¬ν©λλ€.
κ° νμΌμ κ°λ³μ μΌλ‘ μ§μ ν μλ μμ΅λλ€:
tsc --outFile sample.js Validation.ts LettersOnlyValidator.ts ZipCodeValidator.ts Test.ts
λλ νμΌλ³ μ»΄νμΌ(κΈ°λ³Έκ°)μ μ¬μ©νμ¬ κ° μ
λ ₯ νμΌμ λν JavaScript νμΌμ νλμ© λ°©μΆν μ μμ΅λλ€.
λ§μ½ μ¬λ¬ κ°μ JS νμΌμ΄ μμ±λλ©΄ μΉ νμ΄μ§μ μλ <script>
νκ·Έλ₯Ό μ¬μ©νμ¬ λ°©μΆλ κ° νμΌμ μ μ ν μμλλ‘ λ‘λν΄μΌ ν©λλ€.
μλ₯Ό λ€μ΄:
<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" />
λ€μμ€νμ΄μ€ μμ
μ λ¨μνν μ μλ λ λ€λ₯Έ λ°©λ²μ import x = require("name")
λ₯Ό μ¬μ©νμ¬ μΌλ°μ μΌλ‘ μ¬μ©λλ κ°μ²΄μ λ 짧μ μ΄λ¦μ μμ±νλ κ²μ
λλ€.
μ΄λ¬ν μ’
λ₯μ imports(λ³μΉμΌλ‘ λΆλ¦Ό)λ₯Ό λͺ¨λ importsμμ μμ±λ κ°μ²΄λ₯Ό ν¬ν¨ν λͺ¨λ μ’
λ₯μ μλ³μμ μ¬μ©ν μ μμ΅λλ€.
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
μ λν λ³κ²½ μ¬νμ μλ λ³μμ λ°μλμ§ μμ΅λλ€.
TypeScriptμμ μμ±λμ§ μμ λΌμ΄λΈλ¬λ¦¬μ ννμ μ€λͺ
νλ €λ©΄ λΌμ΄λΈλ¬λ¦¬μμ νμνλ APIλ₯Ό μ μΈν΄μΌ ν©λλ€.
λλΆλΆμ JavaScript λΌμ΄λΈλ¬λ¦¬λ λͺ κ°μ μ΅μμ λ 벨μ κ°μ²΄λ§ λ
ΈμΆνλ―λ‘ λ€μμ€νμ΄μ€λ κ°μ²΄λ₯Ό ννν μμλ μ’μ λ°©λ²μ
λλ€.
ꡬνμ "ambient"μΌλ‘ μ μνμ§ μλ μ μΈμ νΈμΆν©λλ€.
μΌλ°μ μΌλ‘ μ΄λ€μ .d.ts
νμΌμ μ μλμ΄ μμ΅λλ€.
C/C++μ μ΅μνλ€λ©΄ .d.ts
νμΌλ‘ μκ°ν μ μμ΅λλ€.
λͺ κ°μ§ μλ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€.
μΈκΈ° μλ λΌμ΄λΈλ¬λ¦¬ D3λ d3
μ΄λΌλ μ μ κ°μ²΄μμ κΈ°λ₯μ μ μν©λλ€.
μ΄ λΌμ΄λΈλ¬λ¦¬λ <script>
νκ·Έ (λͺ¨λ λ‘λ λμ )λ₯Ό ν΅ν΄ λ‘λλκΈ° λλ¬Έμ μ μΈμ λ€μμ€νμ΄μ€λ₯Ό μ¬μ©νμ¬ κ·Έ ννμ μ μν©λλ€.
TypeScript μ»΄νμΌλ¬κ° μ΄ ννμ λ³΄λ €λ©΄ ambient λ€μμ€νμ΄μ€ μ μΈμ μ¬μ©ν©λλ€.
μλ₯Ό λ€μ΄ λ€μκ³Ό κ°μ΄ μμ±ν μ μμ΅λλ€:
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;