ν¨μλ JavaScriptλ‘ λ λͺ¨λ μ ν리μΌμ΄μ μμμ κΈ°λ³Έμ μΈ κ΅¬μ± μμμ λλ€. JavaScript ν¨μλ μΆμν κ³μΈ΅μ ꡬμΆνκ±°λ ν΄λμ€ λͺ¨λ°©, μ 보 μλ, λͺ¨λμ λν λ°©λ²μ μ 곡ν©λλ€. TypeScriptμλ ν΄λμ€, λ€μμ€νμ΄μ€, λͺ¨λμ΄ μμ§λ§, ν¨μλ μ¬μ ν μ΄ μΌμ μ΄λ»κ² ν κ²μΈμ§λ₯Ό μ€λͺ νλ λ° μμ΄ ν΅μ¬ μν μ μνν©λλ€. TypeScriptμμλ νμ€ JavaScript ν¨μκ° μμ μ μμνκ² νλλ‘ λͺ κ°μ§ μλ‘μ΄ κΈ°λ₯μ μΆκ°ν©λλ€.
TypeScript ν¨μλ JavaScriptμ λ§μ°¬κ°μ§λ‘ κΈ°λͺ ν¨μ(named function)κ³Ό μ΅λͺ ν¨μ(anonymous function)λ‘ λ§λ€ μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ APIμμ ν¨μ λͺ©λ‘μ μμ±νλ μΌνμ± ν¨μλ₯Ό μ¨μ λ€λ₯Έ ν¨μλ‘ μ λ¬νλ μ ν리μΌμ΄μ μ κ°μ₯ μ ν©ν λ°©λ²μ μ νν μ μμ΅λλ€.
JavaScriptμμμ μ΄ λ κ°μ§ λ°©λ²μ λν μμλ₯Ό λΉ λ₯΄κ² λ€μ λ³΄κ² μ΅λλ€:
// κΈ°λͺ
ν¨μ
fucntion add(x, y) {
return x + y;
}
// μ΅λͺ
ν¨μ
let myAdd = function(x, y) { return x + y };
JavaScriptμμμ²λΌ, ν¨μλ ν¨μ μΈλΆμ λ³μλ₯Ό μ°Έμ‘°ν μ μμ΅λλ€. μ΄λ° κ²½μ°λ₯Ό, λ³μλ₯Ό μΊ‘μ²(capture) νλ€κ³ ν©λλ€. μ΄κ²μ΄ μ΄λ»κ² μλνλμ§ (κ·Έλ¦¬κ³ μ΄ κΈ°μ μ μ¬μ©ν λμ μ₯λ¨μ )λ₯Ό μ΄ν΄νλ κ²μ μ΄ λ³Έλ¬Έμ μ£Όμ λ₯Ό λ²μ΄λλ κ²μ΄μ§λ§, μ΄ λ©μ»€λμ¦μ΄ μ΄λ»κ² μλνλμ§μ λν νμ€ν μ΄ν΄λ JavaScript λ° TypeScriptλ₯Ό μ¬μ©νλ λ° μμ΄ μ€μν©λλ€.
let z = 100;
function addToZ(x, y) {
return x + y + z;
}
μ΄μ μ μ¬μ©νλ μμμ νμ μ λν΄λ³΄κ² μ΅λλ€.
function add(x: number, y: number): number {
return x + y;
}
let myAdd = function(x: number, y: number): number { return x + y };
κ° νλΌλ―Έν°μ ν¨μ μμ μ λ°νλ νμ μ μ ν΄μ€ μ μμ΅λλ€. TypeScriptλ λ°ν λ¬Έμ λ³΄κ³ λ°ν νμ μ νμ ν μ μμΌλ―λ‘ λ°ν νμ μ μλ΅ν μ μμ΅λλ€.
ν¨μμ νμ μ λΆμμΌλ, μ΄μ ν¨μ νμ λ€μ μ΄ν΄λ³΄κ³ ν¨μμ μ 체 νμ μ μμ±ν΄ λ΄ μλ€.
let myAdd: (x: number, y: number) => number =
function(x: number, y: number): number { return x + y; };
ν¨μμ νμ μ 맀κ°λ³μμ νμ κ³Ό λ°ν νμ μ΄ μμ΅λλ€. μ 체 ν¨μ νμ μ μμ±νκ³ μ νλ€λ©΄ μ΄ λ κ°μ§ νμ μ΄ νμν©λλ€. 맀κ°λ³μ λͺ©λ‘μ²λΌ κ° λ§€κ°λ³μμ μ΄λ¦κ³Ό νμ νμ μ μμ±ν΄ μ€μλ€. μμ±νλ μ΄λ¦μ κ°λ μ±μ μν κ²μ λλ€. μμ μ½λ λμ μ΄λ κ² μΈ μλ μμ΅λλ€:
let myAdd: (baseValue: number, increment: number) => number =
function(x: number, y: number): number { return x + y; };
맀κ°λ³μμ νμ λ€μ΄ μ¬λ°λ₯΄κ² λμ΄λμ΄ μλ€λ©΄ ν¨μ νμ μ μ΄λ¦μ λΆμ΄λλΌλ μ ν¨ν νμ μΌλ‘ κ°μ£Όν©λλ€.
λ λ²μ§Έλ‘ λ°ν νμ
μ
λλ€.
맀κ°λ³μ νμ
λ€κ³Ό λ°ν νμ
μ¬μ΄μ 'νμ΄ν νκΈ°'( =>
)λ₯Ό μ¨μ λ°ν νμ
μ λΆλͺ
ν ν μ μμ΅λλ€.
μ΄μ μ μΈκΈνλ―μ΄, ν¨μ νκΈ°μ νμν λΆλΆμ
λλ€, κ·Έλμ λ§μ½ ν¨μκ° κ°μ λ°ννμ§ μλλ€λ©΄ λΉμλλ λμ void
λ₯Ό μ¨μ νμν©λλ€.
μ°Έκ³ λ‘, 맀κ°λ³μ νμ κ³Ό λ°ν νμ λ§μ΄ ν¨μ νμ μ ꡬμ±ν©λλ€. μΊ‘μ²λ λ³μλ νμ μ λ°μλμ§ μμ΅λλ€. μ¬μ€μ μΊ‘μ²λ λ³μλ ν¨μμ "μ¨κ²¨μ§ μν"μ μΌλΆμ΄κ³ APIλ₯Ό ꡬμ±νμ§ μμ΅λλ€.
μλ μμλ₯Ό μ§μ μ λ ₯ν΄λ³΄μΈμ. TypeScript μ»΄νμΌλ¬κ° λ°©μ μμ νμͺ½μλ§ νμ μ΄ μλλΌλ νμ μ μμλΌ μ μλ€λ κ²μ μμμ±μ ¨λμ?
// myAddλ μ 체 ν¨μ νμ
μ κ°μ§λλ€
let myAdd = function(x: number, y: number): number { return x + y; };
// 맀κ°λ³μ x μ yλ number νμ
μ κ°μ§λλ€
let myAdd: (baseValue: number, increment: number) => number =
function(x, y) { return x + y; };
μ΄λ¬ν νμ
μΆλ‘ ννλ₯Ό "contextual typing"
μ΄λΌ λΆλ¦
λλ€.
μ΄λ₯Ό ν΅ν΄ μ¬λ¬λΆμ νλ‘κ·Έλ¨μμ νμ
μ μ μ§νκΈ° μν λ
Έλ ₯μ μ€μΌ μ μμ΅λλ€.
TypeScriptμμλ λͺ¨λ 맀κ°λ³μκ° ν¨μμ νμνλ€κ³ κ°μ ν©λλ€.
μ΄κ²μ΄ null
μ΄λ undefined
λ₯Ό μ€ μ μλ€λ κ±Έ μλ―Ένλ κ²μ μλλλ€. λμ ν¨μκ° νΈμΆλ λ, μ»΄νμΌλ¬λ κ° λ§€κ°λ³μμ λν΄ μ¬μ©μκ° κ°μ μ 곡νλμ§λ₯Ό κ²μ¬ν©λλ€.
λν, μ»΄νμΌλ¬λ 맀κ°λ³μλ€μ΄ ν¨μλ‘ μ λ¬λ μ μΌν 맀κ°λ³μλΌκ³ κ°μ ν©λλ€. μμ½νμλ©΄, ν¨μμ μ£Όμ΄μ§ μΈμμ μλ ν¨μκ° κΈ°λνλ 맀κ°λ³μμ μμ μΌμΉν΄μΌ ν©λλ€.
function buildName(firstName: string, lastName: string) {
return firstName + " " + lastName;
}
let result1 = buildName("Bob"); // μ€λ₯, λ무 μ μ 맀κ°λ³μ
let result2 = buildName("Bob", "Adams", "Sr."); // μ€λ₯, λ무 λ§μ 맀κ°λ³μ
let result3 = buildName("Bob", "Adams"); // μ νν¨
JavaScriptμμλ λͺ¨λ 맀κ°λ³μκ° μ νμ μ΄κ³ , μ¬μ©μλ μ ν©νλ€κ³ μκ°νλ©΄ κ·Έλλ‘ λ μ μμ΅λλ€.
κ·Έλ κ² λλ€λ©΄ κ·Έ κ°μ undefined
κ° λ©λλ€.
TypeScriptμμλ μ νμ 맀κ°λ³μλ₯Ό μνλ€λ©΄ 맀κ°λ³μ μ΄λ¦ λμ ?
λ₯Ό λΆμμΌλ‘μ¨ ν΄κ²°ν μ μμ΅λλ€.
κ·Έ μμλ‘ μ±μ μ νμ 맀κ°λ³μλ‘ νλ κ²½μ°λ₯Ό λ€μ΄λ³΄κ² μ΅λλ€:
function buildName(firstName: string, lastName?: string) {
if (lastName)
return firstName + " " + lastName;
else
return firstName;
}
let result1 = buildName("Bob"); // μ§κΈμ λ°λ₯΄κ² λμ
let result2 = buildName("Bob", "Adams", "Sr."); // μ€λ₯, λ무 λ§μ 맀κ°λ³μ
let result3 = buildName("Bob", "Adams"); // μ νν¨
μ΄λ μ νμ 맀κ°λ³μλ λ°λμ 맀κ°λ³μ μ μκ° νμν©λλ€. lastName λμ firstNameμ μ νμ μΌλ‘ νκ³ μΆλ€λ©΄ 맀κ°λ³μμ μμλ₯Ό λ³κ²½ν΄μΌ ν©λλ€.
TypeScriptμμλ μ μ κ° κ°μ μ 곡νμ§ μκ±°λ undefined
λ‘ νμ λμ ν λΉλ 맀κ°λ³μμ κ°μ μ ν΄ λμ μλ μμ΅λλ€.
μ΄κ²μ κΈ°λ³Έ-μ΄κΈ°ν 맀κ°λ³μ
λΌκ³ ν©λλ€.
μ΄μ μμμμ lastNameμ "Smith"
λΌκ³ μ§μ ν΄ λ³΄κ² μ΅λλ€.
function buildName(firstName: string, lastName = "Smith") {
return firstName + " " + lastName;
}
let result1 = buildName("Bob"); // μ¬λ°λ₯΄κ² λμ, "Bob Smith" λ°ν
let result2 = buildName("Bob", undefined); // μ¬μ ν λμ, μμ "Bob Smith" λ°ν
let result3 = buildName("Bob", "Adams", "Sr."); // μ€λ₯, λ무 λ§μ 맀κ°λ³μ
let result4 = buildName("Bob", "Adams"); // μ νν¨
λͺ¨λ νμ 맀κ°λ³μ λ€μ μ€λ κΈ°λ³Έ-μ΄κΈ°ν 맀κ°λ³μ
λ μ νμ μΌλ‘ μ²λ¦¬λλ©°, μ νμ 맀κ°λ³μμ λ§μ°¬κ°μ§λ‘ ν΄λΉ ν¨μλ₯Ό νΈμΆν λ μλ΅ν μ μμ΅λλ€.
μ΄λ μ νμ 맀κ°λ³μμ λ€λ°λ₯΄λ κΈ°λ³Έ 맀κ°λ³μμ νμ
λ€μ΄ 곡ν΅μ±μ 곡μ ν¨μ μλ―Έν©λλ€, κ·Έλμ μ΄ λ κ°μ§
function buildName(firstName: string, lastName?: string) {
// ...
}
μ
function buildName(firstName: string, lastName = "Smith") {
// ...
}
λ (firstName: string, lastName?: string) => string
λΌλ 곡ν΅λ νμ
μ 곡μ ν©λλ€.
lastName
μ κΈ°λ³Έκ°μ νμ
μμ μ¬λΌμ§κ³ μ€μ§ μ νμ 맀κ°λ³μλΌλ μ¬μ€λ§ λ¨κΉλλ€.
μμν μ νμ 맀κ°λ³μμλ λ€λ₯΄κ² κΈ°λ³Έ-μ΄κΈ°ν 맀κ°λ³μ
λ νμ 맀κ°λ³μ λ€μ μ€λ κ²μ΄ κ°μλμ§ μμ΅λλ€.
λ§μ½ κΈ°λ³Έ-μ΄κΈ°ν 맀κ°λ³μ
κ° νμ 맀κ°λ³μλ³΄λ€ μμ μ€κ² λλ€λ©΄ μ¬μ©μκ° λͺ
μμ μΌλ‘ undefined
λ₯Ό μ λ¬ν΄ μ£Όμ΄μΌ κΈ°λ³Έ-μ΄κΈ°ν 맀κ°λ³μ
λ₯Ό λ³Ό μ μμ΅λλ€.
μμ μ¬μ©νλ μμμ κΈ°λ³Έ μ΄κΈ°νλ₯Ό firstName
μ μ μ©ν κ²μ
λλ€:
function buildName(firstName = "Will", lastName: string) {
return firstName + " " + lastName;
}
let result1 = buildName("Bob"); // μ€λ₯, λ무 μ μ 맀κ°λ³μ
let result2 = buildName("Bob", "Adams", "Sr."); // μ€λ₯, λ무 λ§μ 맀κ°λ³μ
let result3 = buildName("Bob", "Adams"); // μ±κ³΅, "Bob Adams" λ°ν
let result4 = buildName(undefined, "Adams"); // μ±κ³΅, "Will Adams" λ°ν
νμ, μ νμ , κΈ°λ³Έ 맀κ°λ³μλ ν λ²μ νλμ 맀κ°λ³μλ§μ κ°μ§κ³ μ΄μΌκΈ°ν©λλ€.
λλ‘λ λ€μμ 맀κ°λ³μλ₯Ό κ·Έλ£Ή μ§μ΄ μμ
νκΈ°λ₯Ό μνκ±°λ, ν¨μκ° μ΅μ’
μ μΌλ‘ μΌλ§λ λ§μ 맀κ°λ³μλ₯Ό μ·¨ν μ§ λͺ¨λ₯Ό λλ μμ κ²μ
λλ€.
JavaScriptμμλ λͺ¨λ ν¨μ λ΄λΆμ μμΉν arguments
λΌλ λ³μλ₯Ό μ¬μ©ν΄ μ§μ μΈμλ₯Ό κ°μ§κ³ μμ
ν μ μμ΅λλ€.
TypeScriptμμλ μ΄ μΈμλ€μ νλμ λ³μλ‘ λͺ¨μ μ μμ΅λλ€:
function buildName(firstName: string, ...restOfName: string[]) {
return firstName + " " + restOfName.join(" ");
}
// employeeName μ "Joseph Samuel Lucas MacKinzie" κ° λ κ²μ
λλ€.
let employeeName = buildName("Joseph", "Samuel", "Lucas", "MacKinzie");
λλ¨Έμ§ λ§€κ°λ³μλ μ νμ 맀κ°λ³μλ€μ μλ₯Ό 무νμΌλ‘ μ·¨κΈν©λλ€.
λλ¨Έμ§ λ§€κ°λ³μλ‘ μΈμλ€μ λκ²¨μ€ λλ λΉμ μ΄ μνλ λ§νΌ λ겨 μ€ μλ μμ΅λλ€; μ무κ²λ λκ²¨μ£Όμ§ μμ μλ μμ΅λλ€.
μ»΄νμΌλ¬λ μλ΅ λΆνΈ (...
) λ€μ μ΄λ¦μΌλ‘ μ λ¬λ μΈμ λ°°μ΄μ λΉλνμ¬ ν¨μμμ μ¬μ©ν μ μλλ‘ ν©λλ€.
μλ΅ λΆνΈλ λλ¨Έμ§ λ§€κ°λ³μκ° μλ ν¨μμ νμ μλ μ¬μ©λ©λλ€:
function buildName(firstName: string, ...restOfName: string[]) {
return firstName + " " + restOfName.join(" ");
}
let buildNameFun: (fname: string, ...rest: string[]) => string = buildName;
this
κ° JavaScriptμμ μ΄λ»κ² μ°μ΄λμ§ μλ κ²μ μΌμ’
μ ν΅κ³Όμλ‘μ
λλ€.
TypeScriptλ JavaScriptμ μμ μ§ν©μ΄λ―λ‘ TypeScript κ°λ°μλ€ μμ thisκ° μ΄λ»κ² μ°μ΄λμ§ λλ thisκ° μλͺ» μ°μΌ λλ₯Ό λ°κ²¬νλ λ°©λ²μ λ°°μΈ νμκ° μμ΅λλ€.
λ€ννλ TypeScriptλ λͺ κ°μ§ κΈ°μ λ€λ‘ μλͺ»λ this
μ¬μ©μ μ‘μλΌ μ μμ΅λλ€.
λ§μ½ JavaScriptμμ thisκ° μ΄λ»κ² λμνλμ§ μκ³ μΆλ€λ©΄ λ¨Όμ Yehuda Katzμ κΈ JavaScript ν¨μ νΈμΆκ³Ό "this" μ΄ν΄νκΈ° μ μ½λλ‘ ν©λλ€.
Yehudaμ κΈμ this
μ λ΄λΆ λμμ μμ£Ό μ μ€λͺ
νλ―λ‘, μ¬κΈ°μλ κΈ°λ³Έλ§ λ€λ£° κ²μ
λλ€.
JavaScriptμμ, this
λ ν¨μκ° νΈμΆλ λ μ ν΄μ§λ λ³μμ
λλ€.
λ§€μ° κ°λ ₯νκ³ μ μ°ν κΈ°λ₯μ΄μ§λ§ μ΄κ²μ νμ ν¨μκ° μ€νλλ μ½ν
μ€νΈμ λν΄ μμμΌ νλ€λ μκ³ κ° μκΉλλ€.
νΉν ν¨μλ₯Ό λ°ννκ±°λ μΈμλ‘ λκΈΈ λμ νΌλμ€λ¬μμ μ
λͺ
λμ΅λλ€.
μμλ₯Ό λ΄ μλ€:
let deck = {
suits: ["hearts", "spades", "clubs", "diamonds"],
cards: Array(52),
createCardPicker: function() {
return function() {
let pickedCard = Math.floor(Math.random() * 52);
let pickedSuit = Math.floor(pickedCard / 13);
return {suit: this.suits[pickedSuit], card: pickedCard % 13};
}
}
}
let cardPicker = deck.createCardPicker();
let pickedCard = cardPicker();
alert("card: " + pickedCard.card + " of " + pickedCard.suit);
createCardPicker
κ° μκΈ° μμ μ λ°ννλ ν¨μμμ μ£Όλͺ©ν΄ μ£ΌμΈμ.
μ΄ μμ λ₯Ό μλμν€λ©΄ κΈ°λνλ 경보 μ°½ λμ μ€λ₯κ° λ°μν κ²μ
λλ€.
createCardPicker
μ μν΄ μμ±λ ν¨μμμ μ¬μ© μ€μΈ this
κ° deck
κ°μ²΄κ° μλ window
μ μ€μ λμκΈ° λλ¬Έμ
λλ€.
cardPicker()
μ μ체μ μΈ νΈμΆ λλ¬Έμ μκΈ΄ μΌμ
λλ€.
μ΅μμ λ 벨μμμ λΉ-λ©μλ λ¬Έλ²μ νΈμΆμ this
λ₯Ό window
λ‘ ν©λλ€.
(Note: strict modeμμλ this
κ° window
λμ undefined
κ° λ©λλ€. )
μ΄ λ¬Έμ λ λμ€μ μ¬μ©ν ν¨μλ₯Ό λ°ννκΈ° μ μ λ°μΈλ©μ μλ§κ² νλ κ²μΌλ‘ ν΄κ²°ν μ μμ΅λλ€.
μ΄ λ°©λ²λλ‘λΌλ©΄ λμ€μ μ¬μ©νλ λ°©λ²μ μκ΄μμ΄ μλ³Έ deck
κ°μ²΄λ₯Ό κ³μν΄μ λ³Ό μ μμ΅λλ€.
μ΄λ₯Ό μν΄, ν¨μ ννμμ ES6μ νμ΄ν ν¨μλ‘ λ°κΏ κ²μ
λλ€.
νμ΄ν ν¨μλ ν¨μκ° νΈμΆ λ κ³³μ΄ μλ ν¨μκ° μμ±λ μͺ½μ this
λ₯Ό μΊ‘μ²ν©λλ€:
let deck = {
suits: ["hearts", "spades", "clubs", "diamonds"],
cards: Array(52),
createCardPicker: function() {
// NOTE: μλ«μ€μ νμ΄ν ν¨μλ‘μ¨, 'this'λ₯Ό μ΄κ³³μμ μΊ‘μ²ν μ μλλ‘ ν©λλ€
return () => {
let pickedCard = Math.floor(Math.random() * 52);
let pickedSuit = Math.floor(pickedCard / 13);
return {suit: this.suits[pickedSuit], card: pickedCard % 13};
}
}
}
let cardPicker = deck.createCardPicker();
let pickedCard = cardPicker();
alert("card: " + pickedCard.card + " of " + pickedCard.suit);
--noImplicitThis
νλκ·Έλ₯Ό μ»΄νμΌλ¬μ μ λ¬νλ μ€μλ₯Ό νκ² λλ€λ©΄ TypeScriptλ κ²½κ³ λ₯Ό νμν κ²μ
λλ€.
this.suits[pickedSuit]
μ this
λ any
νμ
μΈ κ²μ μ§κ³ λμ΄κ°κ² μ΅λλ€.
λΆννλ this.suits[pickedSuit]
μ νμ
μ μ¬μ ν any
μ
λλ€.
this
κ° κ°μ²΄ 리ν°λ΄ λ΄λΆμ ν¨μμμ μκΈ° λλ¬Έμ
λλ€.
μ΄κ²μ κ³ μΉκΈ° μν΄ λͺ
μμ μΌλ‘ this
맀κ°λ³μλ₯Ό μ€ μ μμ΅λλ€.
this
맀κ°λ³μλ ν¨μμ 맀κ°λ³μ λͺ©λ‘μμ κ°μ₯ λ¨Όμ λμ€λ κ°μ§ 맀κ°λ³μμ
λλ€.
function f(this: void) {
// λ
립ν ν¨μμμ `this`λ₯Ό μ¬μ©ν μ μλ κ²μ νμΈν¨
}
λͺ
ννκ³ μ¬μ¬μ©νκΈ° μ½κ² Card
μ Deck
λ κ°μ§ μΈν°νμ΄μ€ νμ
λ€μ μμμ μΆκ°ν΄ λ³΄κ² μ΅λλ€.
interface Card {
suit: string;
card: number;
}
interface Deck {
suits: string[];
cards: number[];
createCardPicker(this: Deck): () => Card;
}
let deck: Deck = {
suits: ["hearts", "spades", "clubs", "diamonds"],
cards: Array(52),
// NOTE: μλ ν¨μλ μ΄μ calleeκ° λ°λμ Deck νμ
μ΄μ΄μΌ ν¨μ λͺ
μμ μΌλ‘ μ§μ ν©λλ€.
createCardPicker: function(this: Deck) {
return () => {
let pickedCard = Math.floor(Math.random() * 52);
let pickedSuit = Math.floor(pickedCard / 13);
return {suit: this.suits[pickedSuit], card: pickedCard % 13};
}
}
}
let cardPicker = deck.createCardPicker();
let pickedCard = cardPicker();
alert("card: " + pickedCard.card + " of " + pickedCard.suit);
μ΄μ TypeScriptλ createCardPicker
κ° Deck
κ°μ²΄μμ νΈμΆλλ€λ κ²μ μκ² λμ΅λλ€.
μ΄κ²μ this
κ° any
νμ
μ΄ μλλΌ Deck
νμ
μ΄λ©° λ°λΌμ --noImplicitThis
νλκ·Έκ° μ΄λ€ μ€λ₯λ μΌμΌν€μ§ μλλ€λ κ²μ μλ―Έν©λλ€.
λμ€μ νΈμΆν μ½λ°± ν¨μλ₯Ό λΌμ΄λΈλ¬λ¦¬μ μ λ¬ν λ this
λλ¬Έμ μ€λ₯κ° λ°μν μ μμ΅λλ€.
λΌμ΄λΈλ¬λ¦¬λ μ½λ°±μ μΌλ° ν¨μμ²λΌ νΈμΆνλ―λ‘ this
λ undefined
κ° λ©λλ€.
μΌλΆ μμ
μμλ this
맀κ°λ³μλ₯Ό μ½λ°± μ€λ₯λ₯Ό λ§λλ° μ¬μ©ν μ μμ΅λλ€.
λ¨Όμ λΌμ΄λΈλ¬λ¦¬ μμ±μλ μ½λ°± νμ
μ this
λ‘ νμλ₯Ό ν΄μ£Όμ΄μΌ ν©λλ€.
interface UIElement {
addClickListener(onclick: (this: void, e: Event) => void): void;
}
this: void
λ addClickListener
κ° onclick
μ΄ this
νμ
μ μꡬνμ§ μλ ν¨μκ° λ κ²μΌλ‘ μμνλ κ²μ μλ―Έν©λλ€.
λ λ²μ§Έλ‘, νΈμΆ μ½λλ₯Ό this
λ‘ νμν©λλ€.
class Handler {
info: string;
onClickBad(this: Handler, e: Event) {
// μ΄λ°, `this`κ° μ¬κΈ°μ μ°μ΄λκ΅°μ. μ΄ μ½λ°±μ μ°λ©΄ λ°νμμμ μΆ©λμ μΌμΌν€κ² κ΅°μ
this.info = e.message;
}
}
let h = new Handler();
uiElement.addClickListener(h.onClickBad); // μ€λ₯!
this
λ‘ νμλ₯Ό ν μνμμ onClickBad
κ° λ°λμ Handler
μ μΈμ€ν΄μ€λ‘μ¨ νΈμΆλμ΄μΌ ν¨μ λͺ
μν΄ μ£Όμ΄μΌ ν©λλ€.
κ·Έλ¬λ©΄ TypeScriptλ addClickListener
κ° this: void
λ₯Ό κ°λ ν¨μλ₯Ό νμλ‘ νλ€λ κ²μ κ°μ§ν©λλ€.
μ€λ₯λ₯Ό κ³ μΉκΈ° μν΄ this
μ νμ
μ λ°κΏμ€λλ€:
class Handler {
info: string;
onClickGood(this: void, e: Event) {
// void νμ
μ΄κΈ° λλ¬Έμ thisλ μ΄κ³³μμ μΈ μ μμ΅λλ€!
console.log('clicked!');
}
}
let h = new Handler();
uiElement.addClickListener(h.onClickGood);
onClickGood
μ΄ this
νμ
μ void
λ‘ μ§μ νκ³ μκΈ° λλ¬Έμ addClickListener
λ‘ λ겨μ§λλ° μ ν©ν©λλ€.
λ¬Όλ‘ , μ΄κ²μ΄ this.info
λ₯Ό μΈ μ μλ κ²μ μλ―ΈνκΈ°λ ν©λλ€.
λ§μ½ λΉμ μ΄ this.info
κΉμ§ μνλ€λ©΄ νμ΄ν ν¨μλ₯Ό μ¬μ©ν΄μΌ ν κ²λλ€:
class Handler {
info: string;
onClickGood = (e: Event) => { this.info = e.message }
}
μ΄λ¬ν μμ
μ νμ΄ν ν¨μκ° μΈλΆμ this
λ₯Ό μ¬μ©νκΈ° λλ¬Έμ κ°λ₯νλ―λ‘ this: void
μΌ κ²μΌλ‘ κΈ°λνλ 무μΈκ°λΌλ©΄ μ λ¬μ λ¬Έμ κ° μμ΅λλ€.
Handler
νμ
κ°μ²΄λ§λ€ νλμ νμ΄ν ν¨μκ° μμ±λλ€λ μ μ΄ λ¨μ μ
λλ€.
λ°λ©΄, λ©μλλ€μ νλλ§ μμ±λμ΄ Handler
μ νλ‘ν νμ
μ λΆμ΅λλ€.
κ·Έλ€μ Handler
νμ
μ λͺ¨λ κ°μ²΄ κ°μ 곡μ λ©λλ€.
JavaScriptλ λ³Έμ§μ μΌλ‘ λ§€μ° λμ μΈ μΈμ΄μ λλ€. νλμ JavaScript ν¨μκ° μ λ¬λ μΈμμ ννμ λ°λΌ λ€λ₯Έ νμ μ κ°μ²΄λ€μ λ°ννλ κ²μ νν μΌμ λλ€.
let suits = ["hearts", "spades", "clubs", "diamonds"];
function pickCard(x): any {
// μΈμκ° λ°°μ΄ λλ κ°μ²΄μΈμ§ νμΈ
// λ§μ½ κ·Έλ λ€λ©΄, deckμ΄ μ£Όμ΄μ§κ³ cardλ₯Ό μ νν©λλ€.
if (typeof x == "object") {
let pickedCard = Math.floor(Math.random() * x.length);
return pickedCard;
}
// κ·Έλ μ§ μλ€λ©΄ κ·Έλ₯ cardλ₯Ό μ νν©λλ€.
else if (typeof x == "number") {
let pickedSuit = Math.floor(x / 13);
return { suit: suits[pickedSuit], card: x % 13 };
}
}
let myDeck = [{ suit: "diamonds", card: 2 }, { suit: "spades", card: 10 }, { suit: "hearts", card: 4 }];
let pickedCard1 = myDeck[pickCard(myDeck)];
alert("card: " + pickedCard1.card + " of " + pickedCard1.suit);
let pickedCard2 = pickCard(15);
alert("card: " + pickedCard2.card + " of " + pickedCard2.suit);
μ¬κΈ° μ¬μ©μκ° μ λ¬νλ κ²μ λ°λΌ λ κ°μ§ λ€λ₯Έ κ²°κ³Όλ₯Ό λ°ννλ ν¨μκ° μμ΅λλ€. μ¬μ©μκ° deckμ μλ―Ένλ κ°μ²΄ κ°μ μ λ¬νλ€λ©΄ ν¨μκ° μΉ΄λλ₯Ό μ νν©λλ€. μ¬μ©μκ° μΉ΄λλ₯Ό μ ννλ©΄ μ νν μΉ΄λκ° λ¬΄μμΈμ§ λλ΅ν΄ μ€λλ€. νμ§λ§ νμ μμ€ν μμ μ΄κ²μ μ΄λ»κ² ꡬνν κ²μ λκΉ?
μ λ΅μ μ€λ²λ‘λ λͺ©λ‘μΌλ‘ λμΌν ν¨μμ λ€μ€ ν¨μ νμ
μ μ 곡νλ κ²μ
λλ€.
μ€λ²λ‘λ λͺ©λ‘μ μ»΄νμΌλ¬κ° ν¨μ νΈμΆλ€μ ν΄κ²°ν λ μ¬μ©νλ κ²μ
λλ€.
μ€λ²λ‘λ λͺ©λ‘μΌλ‘ pickCard
κ° λμμ μΉμΈνκ³ λ°ννλ κ²μ ꡬνν΄ λ΄
μλ€:
let suits = ["hearts", "spades", "clubs", "diamonds"];
function pickCard(x: {suit: string; card: number; }[]): number;
function pickCard(x: number): {suit: string; card: number; };
function pickCard(x): any {
// μΈμκ° λ°°μ΄ λλ κ°μ²΄μΈμ§ νμΈ
// λ§μ½ κ·Έλ λ€λ©΄, deckμ΄ μ£Όμ΄μ§κ³ cardλ₯Ό μ νν©λλ€.
if (typeof x == "object") {
let pickedCard = Math.floor(Math.random() * x.length);
return pickedCard;
}
// κ·Έλ μ§ μλ€λ©΄ κ·Έλ₯ cardλ₯Ό μ νν©λλ€.
else if (typeof x == "number") {
let pickedSuit = Math.floor(x / 13);
return { suit: suits[pickedSuit], card: x % 13 };
}
}
let myDeck = [{ suit: "diamonds", card: 2 }, { suit: "spades", card: 10 }, { suit: "hearts", card: 4 }];
let pickedCard1 = myDeck[pickCard(myDeck)];
alert("card: " + pickedCard1.card + " of " + pickedCard1.suit);
let pickedCard2 = pickCard(15);
alert("card: " + pickedCard2.card + " of " + pickedCard2.suit);
μ΄ λ³νλ₯Ό ν΅ν΄, μ€λ²λ‘λλ pickCard
ν¨μμ λν΄ νμ
κ²μ¬ νΈμΆμ μ 곡ν©λλ€.
μ»΄νμΌλ¬κ° μλ§μ νμ κ²μ¬λ₯Ό νκΈ° μν΄μ, JavaScriptμ λΉμ·ν νλ‘μΈμ€λ₯Ό λ°λ¦ λλ€. μ€λ²λ‘λ λͺ©λ‘μμ 첫 λ²μ§Έ μ€λ²λ‘λλ₯Ό μ§ννλ©΄μ μ 곡λ 맀κ°λ³μλ₯Ό μ¬μ©νμ¬ ν¨μλ₯Ό νΈμΆνλ €κ³ μλν©λλ€. λ§μ½ μΌμΉνκ² λλ€λ©΄ ν΄λΉ μ€λ²λ‘λλ₯Ό μλ§μ μ€λ²λ‘λλ‘ μ ννμ¬ μμ μ μνν©λλ€. μ΄λ¬ν μ΄μ λ‘ κ°μ₯ ꡬ체μ μΈ κ²λΆν° μ€λ²λ‘λ 리μ€ν μ νλ κ²μ΄ μΌλ°μ μ λλ€.
μ μμ μμ function pickCard(x): any
λ μ€λ²λ‘λ λͺ©λ‘μ ν΄λΉλμ§ μμμ μ μνμΈμ, κ·Έλμ λ κ°μ§ μ€λ²λ‘λλ§μ κ°μ§λλ€: κ°μ²΄λ₯Ό λ°λκ² νλμ μ«μλ₯Ό λ°λ κ² νλ.
λ€λ₯Έ 맀κ°λ³μ νμ
μΌλ‘ pickCard
λ₯Ό νΈμΆνλ κ²μ μ€λ₯κ° λ°μν©λλ€.