ν¨μλ JavaScriptμ λͺ¨λ μ ν리μΌμ΄μ
μ ꡬμ±νλ κΈ°λ³Έ μμμ
λλ€.
ν΄λμ€λ μΆμν κ³μΈ΅, ν΄λμ€, μ 보 μλ λ° λͺ¨λμ ꡬμΆνλ λ°©λ²μ
λλ€.
TypeScriptμμλ ν΄λμ€μ λ€μ μ€νμ΄μ€ κ·Έλ¦¬κ³ λͺ¨λμ΄ μμ§λ§ ν¨μλ κ·ΈλΌμλ λΆκ΅¬νκ³ μμ
λ°©λ²μ μ€λͺ
νλ λ° μ€μν μν μ ν©λλ€.
λν TypeScriptλ νμ€ JavaScript κΈ°λ₯μ λͺκ°μ§ μλ‘μ΄ κΈ°λ₯μ μΆκ°νμ¬ μμ
μ λ μ½κ² ν΄ μ€λλ€.
JavaScriptμ λ§μ°¬κ°μ§λ‘ TypeScript ν¨μλ κΈ°λͺ
ν¨μ λλ μ΅λͺ
ν¨μλ‘ λ§λ€ μ μμ΅λλ€.
μ΄λ₯Ό ν΅ν΄ APIμ ν¨μ λͺ©λ‘μ μμ±νλ λ€λ₯Έ ν¨μμ μ λ¬ν μΌνμ± ν¨μμ΄λ μ ν리μΌμ΄μ
μ κ°μ₯ μ ν©ν μ κ·Ό λ°©λ²μ μ νν μ μμ΅λλ€.
μ΄ λκ°μ§ μ κ·Ό λ°©μμ΄ JavaScriptμμ μ΄λ»κ² 보μ΄λμ§ λΉ λ₯΄κ² μμ½νλ©΄:
// κΈ°λͺ
ν¨μ
function 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μμ μ νμ μΈ λ§€κ°λ³μλ₯Ό μ¬μ©νλ €λ©΄ μ νμ μΌλ‘ μ¬μ©νλ €λ 맀κ°λ³μμ λμ ?
λ₯Ό μΆκ°νμΈμ.
μλ₯Ό λ€μ΄ μμμ μ¬μ©ν lastName 맀κ°λ³μλ₯Ό μ νμ μΌλ‘ μ¬μ©ν μ μλλ‘ ν©λλ€:
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"); // μ, λ± λ§μ΅λλ€
λͺ¨λ μ νμ 맀κ°λ³μλ νμ 맀κ°λ³μλ₯Ό λ°λΌμμΌ ν©λλ€.
last name λμ first nameμ μ νμ 맀κ°λ³μλ‘ λ§λ€κ³ μΆλ€λ©΄ ν¨μμ 맀κ°λ³μ μμλ₯Ό λ³κ²½ν΄μΌ ν©λλ€.
μ¦ λͺ©λ‘μ first nameμ λ§μ§λ§μ λ£μ΄μΌν©λλ€.
TypeScriptμμ μ¬μ©μκ° λ§€κ°λ³μλ₯Ό μ 곡νμ§ μκ±°λ μ¬μ©μκ° λμ undefined
λ₯Ό μ λ¬νλλΌλ 맀κ°λ³μκ°μ ν λΉλλ κ°μ μ€μ ν μ μμ΅λλ€.
μ΄κ²μ κΈ°λ³Έ 맀κ°λ³μ(default-initialized parameters)λΌκ³ ν©λλ€.
μμ μμ λ₯Ό λ°λΌ last nameμ κΈ°λ³Έκ°μ "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(" ");
}
let employeeName = buildName("Joseph", "Samuel", "Lucas", "MacKinzie");
λλ¨Έμ§ λ§€κ°λ³μλ 무νμ μΈ μμ μ νμ 맀κ°λ³μλ‘ μ²λ¦¬λ©λλ€.
Rest 맀κ°λ³μμ μΈμλ₯Ό μ λ¬ν λλ μνλ λ§νΌ μ¬μ©ν μ μμΌλ©° μ¬μ§μ΄ ν΅κ³Όν μ μμ΅λλ€.
μ»΄νμΌλ¬λ μ€μν (...
) λ€μμ μ λ¬λ μΈμλ€μ λ°°μ΄μ μμ±νμ¬ ν¨μμμ μ¬μ©ν μ μμ΅λλ€.
μ€μν(...
)λ λλ¨Έμ§ λ§€κ°λ³μκ° μλ ν¨μμ νμ
μλ μ¬μ©λ©λλ€:
function buildName(firstName: string, ...restOfName: string[]) {
return firstName + " " + restOfName.join(" ");
}
let buildNameFun: (fname: string, ...rest: string[]) => string = buildName;
JavaScriptμμ this
λ₯Ό μ¬μ©λ²μ λ°°μ°λ κ²μ μΌμ’
μ ν΅κ³Ό μλ‘μ
λλ€.
TypeScriptλ JavaScriptμ μμ μ§ν©μ΄κΈ° λλ¬Έμ TypeScript κ°λ°μλ€λ this
μ μ¬μ©νλ λ°©λ²κ³Ό μ¬λ°λ₯΄κ² μ¬μ©λκ³ μμ§ μμ λλ₯Ό μ°Ύμλ΄λ λ°©λ²μ λ°°μμΌ ν©λλ€.
JavaScriptμμ this
κ° μ΄λ»κ² μλνλμ§ μμμΌ νλ€λ©΄ Yehuda Katzμ Understanding JavaScript Function Invocation and "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
λ μ체μ μΌλ‘ ν¨μλ₯Ό λ°ννλ ν¨μμ
λλ€.
μμ λ₯Ό μ€ννλ €κ³ νλ©΄ alert λμ μ€λ₯κ° λ°μν©λλ€.
createCardPicker
μ μν΄ μμ±λ ν¨μμμ μ¬μ©λλ this
κ° deck
κ°μ²΄ λμ μ window
λ‘ μ€μ λμ΄ μκΈ° λλ¬Έμ
λλ€.
μλνλ©΄ cardPicker()
λ μκΈ° μμ μ νΈμΆνκΈ° λλ¬Έμ
λλ€.
μ΄μ κ°μ΄ μ΅μμ λΉ-λ©μλ ꡬ문 νΈμΆμ this
μ window
λ₯Ό μ¬μ©ν©λλ€.
(μ£Όμμ¬ν : μ격λͺ¨λ(strict mode)μμ this
λ window
보λ€λ undefined
κ° λ κ²μ
λλ€).
λμ€μ μ¬μ©ν ν¨μλ₯Ό λ°ννκΈ° μ μ ν¨μμ μ¬λ°λ₯Έ this
κ° μ°κ²°λλλ‘νμ¬ μ΄λ₯Ό ν΄κ²°ν μ μμ΅λλ€.
μ΄λ κ²νλ©΄ λμ€μ μ΄λ»κ² μ¬μ©λλ μκ΄μμ΄ μλμ deck
κ°μ²΄λ₯Ό λ³Ό μ μμ΅λλ€.
μ΄λ₯Ό μν΄ ν¨μ ννμμ ECMAScript 6μ νμ΄ν ꡬ문μΌλ‘ λ³κ²½νμ¬ μ¬μ©ν©λλ€.
νμ΄ν ν¨μλ νΈμΆλ κ³³μ΄ μλ ν¨μκ° μμ± λ κ³³μμ this
λ₯Ό μΊ‘μ²ν©λλ€:
let deck = {
suits: ["hearts", "spades", "clubs", "diamonds"],
cards: Array(52),
createCardPicker: function() {
// μ£Όμ: μλ μ€μ μ΄μ νμ΄ν ν¨μμ
λλ€. μ¬κΈ°μμ '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),
// μ£Όμμ¬ν : μ΄ ν¨μλ μ΄μ λ°λμ 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
λ₯Ό μ¬μ©νμ¬ annotateλ₯Ό λ¬μμΌ ν©λλ€:
interface UIElement {
addClickListener(onclick: (this: void, e: Event) => void): void;
}
this : void
λ addClickListener
κ° onclick
μ΄ this
νμ
μ νμλ‘ νμ§ μλ ν¨μλΌλ κ²μ μλ―Έν©λλ€.
λ λ²μ§Έ, this
λ₯Ό μ¬μ©νμ¬ νΈμΆ μ½λμ ν¨κ» annotateλ₯Ό λ¬μμΌ ν©λλ€:
class Handler {
info: string;
onClickBad(this: Handler, e: Event) {
// μ΄λ°, μ¬κΈ°μ thisλ₯Ό μ¬μ©νμ΄μ. μ΄ μ½λ°±μ μ¬μ©νλ©΄ μΆ©λμΌλ‘ λ°νμ μ€λ₯κ° λ°μν©λλ€.
this.info = e.message;
}
}
let h = new Handler();
uiElement.addClickListener(h.onClickBad); // μ€λ₯!
this
κ° annotatedλμ΄ μμΌλ©΄ onClickBad
λ λ°λμ Handler
μ μΈμ€ν΄μ€μμ νΈμΆλμ΄μΌνλ€λ κ²μ λͺ
μν΄μΌ ν©λλ€.
κ·Έλ° λ€μ TypeScriptλ addClickListener
μ this : void
κ° μλ ν¨μκ° νμνλ€λ κ²μ λ°κ²¬ν©λλ€.
μ€λ₯λ₯Ό ν΄κ²°νλ €λ©΄ this
μ νμ
μ μμ νμΈμ:
class Handler {
info: string;
onClickGood(this: void, e: Event) {
// thisμ νμ
μ΄ voidμ΄κΈ° λλ¬Έμ μ¬κΈ°μλ μ¬μ©ν μ μμ΅λλ€!
console.log('clicked!');
}
}
let h = new Handler();
uiElement.addClickListener(h.onClickGood);
onClickGood
λ this
μ νμ
μ void
λ‘ μ§μ νκΈ° λλ¬Έμ addClickListener
μ μ λ¬ν μ μμ΅λλ€.
λ¬Όλ‘ thisλ λν this.info
λ₯Ό μ¬μ©ν μ μλ€λ κ²μ μλ―Έν©λλ€.
λ κ°μ§ λͺ¨λλ₯Ό μ¬μ©νλ €λ©΄ νμ΄ν ν¨μλ₯Ό μ¬μ©ν΄μΌ ν©λλ€:
class Handler {
info: string;
onClickGood = (e: Event) => { this.info = e.message }
}
μ΄κ²μ νμ΄ν ν¨μκ° this
λ₯Ό μΊ‘μ²νμ§ μκΈ° λλ¬Έμ ν¨κ³Όμ μ
λλ€.
λλ¬Έμ κΈ°λνλ κ² κ°μ΄ νμ this : void
λ₯Ό λκ²¨μ€ μ μμ΅λλ€.
λ¨μ μ Handler νμ
μ κ°μ²΄λ§λ€ νλμ νμ΄ν ν¨μκ° μμ±λλ€λ κ²μ
λλ€.
λ°λ©΄μ λ©μλλ ν λ²λ§ λ§λ€μ΄μ§κ³ νΈλ€λ¬μ νλ‘ν νμ
μ μμλ©λλ€.
μ΄λ¬ν κ°μ²΄λ νΈλ€λ¬ νμ
μ λͺ¨λ κ°μ²΄ μ¬μ΄μ 곡μ λ©λλ€.
JavaScriptλ λ³Έμ§μ μΌλ‘ λ§€μ° λμ μΈ μΈμ΄μ
λλ€.
λ¨μΌ JavaScript ν¨μκ° μ λ¬λ μΈμμ ννλ₯Ό κΈ°λ°μΌλ‘ μλ‘ λ€λ₯Έ νμ
μ κ°μ²΄λ₯Ό λ°ννλ κ²μ λλ¬Έ μΌμ΄ μλλλ€.
let suits = ["hearts", "spades", "clubs", "diamonds"];
function pickCard(x): any {
// κ°μ²΄ / λ°°μ΄λ‘ μμ
νκ³ μλμ§ νμΈν΄λ³΄μΈμ
// κ·Έλ λ€λ©΄ κ·Έκ²λ€μ λ±μ μ£Όκ³ μ¬μ©μλ μΉ΄λλ₯Ό μ νν κ²μ
λλ€.
if (typeof x == "object") {
let pickedCard = Math.floor(Math.random() * x.length);
return pickedCard;
}
// κ·Έλ μ§ μμΌλ©΄ μΉ΄λλ₯Ό μ ννκ²νμΈμ.
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
ν¨μλ μ¬μ©μκ° λ¬΄μμ μ λ¬νλμ§μ λ°λΌ λ κ°μ μλ‘ λ€λ₯Έ λ΄μ©μ λ°νν©λλ€.
μ¬μ©μκ° deckλ₯Ό λνλ΄λ κ°μ²΄λ₯Ό μ λ¬νλ©΄ ν¨μκ° cardλ₯Ό μ νν©λλ€.
μ¬μ©μκ° cardλ₯Ό μ ννλ©΄ κ·Έλ€μ΄ μ νν cardλ₯Ό μλ €μ€λλ€.
νμ§λ§ μ΄κ²μ μ΄λ»κ² νμ
μμ€ν
μ μ€λͺ
ν κΉμ?
μ΄μ λν λλ΅μ μ€λ²λ‘λ λͺ©λ‘κ³Ό λμΌν ν¨μμ λν μ¬λ¬ ν¨μ νμ
μ μ 곡νλ κ²μ΄λ€.
μ΄ λͺ©λ‘μ μ»΄νμΌλ¬κ° ν¨μ νΈμΆμ ν΄κ²°νλ λ° μ¬μ©ν κ²μ
λλ€.
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 {
// κ°μ²΄ / λ°°μ΄λ‘ μμ
νκ³ μλμ§ νμΈν΄λ³΄μΈμ
// κ·Έλ λ€λ©΄ κ·Έκ²λ€μ λ±μ μ£Όκ³ μ¬μ©μλ μΉ΄λλ₯Ό μ νν κ²μ
λλ€.
if (typeof x == "object") {
let pickedCard = Math.floor(Math.random() * x.length);
return pickedCard;
}
// κ·Έλ μ§ μμΌλ©΄ μΉ΄λλ₯Ό μ ννκ²νμΈμ.
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
λ₯Ό λ€λ₯Έ λ§€κ° λ³μ νμ
κ³Ό ν¨κ» νΈμΆνλ©΄ μ€λ₯κ° λ°μν©λλ€.