π€ Chapter 7. μ½λλ₯Ό μμ±νκ³ μ€ννκΈ°
π₯ μμ΄ν 53. νμ μ€ν¬λ¦½νΈ κΈ°λ₯보λ€λ ECMAScript κΈ°λ₯μ μ¬μ©νκΈ°β
νμ μ€ν¬λ¦½νΈκ° νλνλ 2010λ κ²½, μλ°μ€ν¬λ¦½νΈλ κ²°ν¨μ΄ λ§κ³ κ°μ ν΄μΌ ν λΆλΆμ΄ λ§μ μΈμ΄μμ΅λλ€. κ·Έλ¦¬κ³ ν΄λμ€, λ°μ½λ μ΄ν°, λͺ¨λ μμ€ν κ°μ κΈ°λ₯μ΄ μμ΄μ νλ μμν¬λ νΈλμ€νμΌλ¬λ‘ 보μνλ κ²μ΄ μΌλ°μ μΈ λͺ¨μ΅μ΄μμ΅λλ€. κ·Έλ κΈ° λλ¬Έμ νμ μ€ν¬λ¦½νΈλ μ΄κΈ° λ²μ μλ λ 립μ μΌλ‘ κ°λ°ν ν΄λμ€, μ΄κ±°ν(enum), λͺ¨λ μμ€ν μ ν¬ν¨μν¬ μλ°μ μμμ΅λλ€.
μκ°μ΄ νλ₯΄λ©° TC39(μλ°μ€ν¬λ¦½νΈλ₯Ό κ΄μ₯νλ νμ€ κΈ°κ΅¬)λ λΆμ‘±νλ μ λ€μ λλΆλΆ λ΄μ₯ κΈ°λ₯μΌλ‘ μΆκ°νμ΅λλ€. κ·Έλ¬λ μλ°μ€ν¬λ¦½νΈμ μλ‘ μΆκ°λ κΈ°λ₯μ νμ μ€ν¬λ¦½νΈ μ΄κΈ° λ²μ μμ λ 립μ μΌλ‘ κ°λ°νλ κΈ°λ₯κ³Ό νΈνμ± λ¬Έμ λ₯Ό λ°μμμΌ°μ΅λλ€. κ·Έλ κΈ°μ νμ μ€ν¬λ¦½νΈ μ§μμμλ λ€μ μ λ΅ μ€ νλλ₯Ό μ νν΄μΌ νμ΅λλ€. ν κ°μ§ μ λ΅μ νμ μ€ν¬λ¦½νΈ μ΄κΈ° λ²μ μ ννλ₯Ό μ μ§νκΈ° μν΄ μλ°μ€ν¬λ¦½νΈ μ κ· κΈ°λ₯μ λ³νν΄μ λΌμ λ§μΆλ κ²μ λλ€. λ λ€λ₯Έ μ λ΅μ μλ°μ€ν¬λ¦½νΈμ μ κ· κΈ°λ₯μ κ·Έλλ‘ μ±ννκ³ νμ μ€ν¬λ¦½νΈ μ΄κΈ° λ²μ κ³Ό νΈνμ±μ ν¬κΈ°νλ κ²μ λλ€.
νμ μ€ν¬λ¦½νΈ νμ λλΆλΆ λ λ²μ§Έ μ λ΅μ μ ννμ΅λλ€. κ²°κ΅ TC39λ λ°νμ κΈ°λ₯μ λ°μ μν€κ³ , νμ μ€ν¬λ¦½νΈ νμ νμ κΈ°λ₯λ§ λ°μ μν¨λ€λ λͺ νν μμΉμ μΈμ°κ³ νμ¬κΉμ§ μ§μΌμ€κ³ μμ΅λλ€.
κ·Έλ°λ° μ΄ μμΉμ΄ μΈμμ§κΈ° μ μ, μ΄λ―Έ μ¬μ©λκ³ μλ λͺ κ°μ§ κΈ°λ₯μ΄ μμ΅λλ€. μ΄ κΈ°λ₯λ€μ νμ 곡κ°(νμ μ€ν¬λ¦½νΈ)κ³Ό κ° κ³΅κ°(μλ°μ€ν¬λ¦½νΈ)μ κ²½κ³λ₯Ό νΌλμ€λ½κ² λ§λ€κΈ° λλ¬Έμ μ¬μ©νμ§ μλ κ²μ΄ μ’μ΅λλ€. μ¬κΈ°μλ νΌν΄μΌ νλ κΈ°λ₯μ λͺ κ°μ§ μ΄ν΄λ΄ λλ€. κ·Έλ¦¬κ³ λΆκ°νΌνκ² μ΄ κΈ°λ₯μ μ¬μ©νκ² λλ κ²½μ° μ΄λ€ μ μ μ μν΄μΌ νΈνμ± λ¬Έμ λ₯Ό μΌμΌν€μ§ μλμ§ μμλ΄ λλ€.
μ΄κ±°ν(enum)β
λ§μ μΈμ΄μμ λͺλͺ κ°μ λͺ¨μμ λνλ΄κΈ° μν΄ μ΄κ±°νμ μ¬μ©ν©λλ€. νμ μ€ν¬λ¦½νΈμμλ μ΄κ±°νμ μ¬μ©ν μ μμ΅λλ€.
enum Flavor {
VANILLA = 0,
CHOCOLATE = 1,
STRAWBERRY = 2,
}
let flavor = Flavor.CHOCOLATE; // νμ
μ΄ Flavor
Flavor // μλμμ± μΆμ²: VANILLA, CHOCOLATE, STRAWBERRY
Flavor[0] // κ°μ΄ "VANILLA"
λ¨μν κ°μ λμ΄νλ κ²λ³΄λ€ μ€μκ° μ κ³ λͺ ννκΈ° λλ¬Έμ μΌλ°μ μΌλ‘ μ΄κ±°νμ μ¬μ©νλ κ²μ΄ μ’μ΅λλ€. κ·Έλ¬λ νμ μ€ν¬λ¦½νΈμ μ΄κ±°νμ λͺ κ°μ§ λ¬Έμ κ° μμ΅λλ€. νμ μ€ν¬λ¦½νΈμ μ΄κ±°νμ λ€μ λͺ©λ‘μ²λΌ μν©μ λ°λΌ λ€λ₯΄κ² λμν©λλ€.
- μ«μ μ΄κ±°ν(μ μμ μ
Flavor
)μ 0, 1, 2 μΈμ λ€λ₯Έ μ«μκ° ν λΉλλ©΄ λ§€μ° μνν©λλ€. (μ΄ λ°©λ²μ μλ λΉνΈ νλκ·Έ ꡬ쑰λ₯Ό νννκΈ° μν΄ μ€κ³λμμ΅λλ€.) - μμ μ΄κ±°νμ 보ν΅μ μ΄κ±°νκ³Ό λ¬λ¦¬ λ°νμμ μμ ν μ κ±°λ©λλ€. μμ μμ λ₯Ό
const enum Flavor
λ‘ λ°κΎΈλ©΄, μ»΄νμΌλ¬λFlavor.CHOCOLATE
μ1
μΌλ‘ λ°κΏ λ²λ¦½λλ€. μ΄λ° κ²°κ³Όλ κΈ°λνμ§ μμ κ²μ΄λ©°, λ¬Έμμ΄ μ΄κ±°νκ³Ό μ«μ μ΄κ±°νκ³Ό μ ν λ€λ₯Έ λμμ λλ€. preserveConstEnums
νλκ·Έλ₯Ό μ€μ ν μνμ μμ μ΄κ±°νμ 보ν΅μ μ΄κ±°νμ²λΌ λ°νμ μ½λμ μμ μ΄κ±°ν μ 보λ₯Ό μ μ§ν©λλ€.- λ¬Έμμ΄ μ΄κ±°νμ λ°νμμ νμ μμ μ±κ³Ό ν¬λͺ μ±μ μ 곡ν©λλ€. κ·Έλ¬λ νμ μ€ν¬λ¦½νΈμ λ€λ₯Έ νμ κ³Ό λ¬λ¦¬ ꡬ쑰μ νμ΄νμ΄ μλ λͺ λͺ©μ νμ΄νμ μ¬μ©ν©λλ€.
νμ μ€ν¬λ¦½νΈμ μΌλ°μ μΈ νμ λ€μ΄ ν λΉ κ°λ₯μ±μ 체ν¬νκΈ° μν΄μ ꡬ쑰μ νμ΄νμ μ¬μ©νλ λ°λ©΄, λ¬Έμμ΄ μ΄κ±°νμ λͺ λͺ©μ νμ΄νμ μ¬μ©ν©λλ€.
ꡬ쑰μ νμ΄νμ κ΅¬μ‘°κ° κ°μΌλ©΄ ν λΉμ΄ νμ©λλ λ°λ©΄, λͺ λͺ©μ νμ΄νμ νμ μ μ΄λ¦μ΄ κ°μμΌ ν λΉμ΄ νμ©λ©λλ€.
enum Flavor {
VANILLA = 'vanilla',
CHOCOLATE = 'chocolate',
STRAWBERRY = 'strawberry',
}
let flavor = Flavor.CHOCOLATE; // νμ
μ΄ Flavor
flavor = 'strawberry';
// ~~~~~ '"strawberry"' νμμ 'Flavor' νμμ ν λΉν μ μμ΅λλ€.ts(2322)
λͺ
λͺ©μ νμ΄νμ λΌμ΄λΈλ¬λ¦¬λ₯Ό 곡κ°ν λ νμν©λλ€. Flavor
λ₯Ό 맀κ°λ³μλ‘ λ°λ ν¨μλ₯Ό κ°μ ν΄ λ΄
μλ€.
function scoop(flavor: Flavor) { /* ... */ }
Flavor
λ λ°νμ μμ μλ λ¬Έμμ΄μ΄κΈ° λλ¬Έμ, μλ°μ€ν¬λ¦½νΈμμ λ€μμ²λΌ νΈμΆν μ μμ΅λλ€.
scoop('vanilla'); // μλ°μ€ν¬λ¦½νΈμμλ μ μ
κ·Έλ¬λ νμ μ€ν¬λ¦½νΈμμλ μ΄κ±°νμ μν¬νΈνκ³ λ¬Έμμ΄ λμ μ¬μ©ν΄μΌ ν©λλ€.
import { Flavor } from 'ice-cream';
scoop(Flavor.VANILLA);
μ΄μ²λΌ μλ°μ€ν¬λ¦½νΈμ νμ μ€ν¬λ¦½νΈμμ λμμ΄ λ€λ₯΄κΈ° λλ¬Έμ λ¬Έμμ΄ μ΄κ±°νμ μ¬μ©νμ§ μλ κ²μ΄ μ’μ΅λλ€. μ΄κ±°ν λμ 리ν°λ΄ νμ μ μ λμ¨μ μ¬μ©νλ©΄ λ©λλ€.
type Flavor = 'vanilla' | 'chocolate' | 'strawberry';
let flavor: Flavor = 'chocolate'; // μ μ
리ν°λ΄ νμ μ μ λμ¨μ μ΄κ±°νλ§νΌ μμ νλ©° μλ°μ€ν¬λ¦½νΈμ νΈνλλ μ₯μ μ΄ μμ΅λλ€. κ·Έλ¦¬κ³ νΈμ§κΈ°μμ μ΄κ±°νμ²λΌ μλμμ± κΈ°λ₯μ μ¬μ©ν μ μμ΅λλ€.
맀κ°λ³μ μμ±β
μΌλ°μ μΌλ‘ ν΄λμ€λ₯Ό μ΄κΈ°νν λ μμ±μ ν λΉνκΈ° μν΄ μμ±μμ 맀κ°λ³μλ₯Ό μ¬μ©ν©λλ€.
class Person {
name: string;
constructor(name: string) {
this.name = name;
}
}
νμ μ€ν¬λ¦½νΈλ λ κ°κ²°ν λ¬Έλ²μ μ 곡ν©λλ€.
class Person {
constructor(public name: string) {}
}
κ·Έλ¬λ 맀κ°λ³μ μμ±κ³Ό κ΄λ ¨λ λͺ κ°μ§ λ¬Έμ μ μ΄ μ‘΄μ¬ν©λλ€.
- μΌλ°μ μΌλ‘ νμ μ€ν¬λ¦½νΈ μ»΄νμΌμ νμ μ κ±°κ° μ΄λ£¨μ΄μ§λ―λ‘ μ½λκ° μ€μ΄λ€μ§λ§, 맀κ°λ³μ μμ±μ μ½λκ° λμ΄λλ λ¬Έλ²μ λλ€.
- 맀κ°λ³μ μμ±μ΄ λ°νμμλ μ€μ λ‘ μ¬μ©λμ§λ§, νμ μ€ν¬λ¦½νΈ κ΄μ μμλ μ¬μ©λμ§ μλ κ²μ²λΌ 보μ λλ€.
- 맀κ°λ³μ μμ±κ³Ό μΌλ° μμ±μ μμ΄μ μ¬μ©νλ©΄ ν΄λμ€μ μ€κ³κ° νΌλμ€λ¬μμ§λλ€.
class Person {
first: string;
last: string;
constructor(public name: string) {
[this.first, this.last] = name.split(' ');
}
}
Person
ν΄λμ€μλ μΈ κ°μ§ μμ±(first
, last
, name
)μ΄ μμ§λ§, first
μ last
λ§ μμ±μ λμ΄λμ΄ μκ³ name
μ 맀κ°λ³μ μμ±μ μμ΄μ μΌκ΄μ±μ΄ μμ΅λλ€. ꡬ쑰μ νμ΄ν νΉμ± λλ¬Έμ λ€μ μμ μ²λΌ ν λΉν μ μλ€λ κ²μ μ£Όμν΄μΌ ν©λλ€.
class Person {
constructor(public name: string) {}
}
const p: Person = { name: 'Jed Bartlet' }; // μ μ
맀κ°λ³μ μμ±μ νμ μ€ν¬λ¦½νΈμ λ€λ₯Έ ν¨ν΄λ€κ³Ό μ΄μ§μ μ΄κ³ , μ΄κΈμμκ² μμν λ¬Έλ²μ΄λΌλ κ²μ κΈ°μ΅ν΄μΌ ν©λλ€. λν 맀κ°λ³μ μμ±κ³Ό μΌλ° μμ±μ κ°μ΄ μ¬μ©νλ©΄ μ€κ³κ° νΌλμ€λ¬μμ§κΈ° λλ¬Έμ ν κ°μ§λ§ μ¬μ©νλ κ²μ΄ μ’μ΅λλ€.
λ€μμ€νμ΄μ€μ νΈλ¦¬ν μ¬λμ μν¬νΈβ
ECMAScript 2015 μ΄μ μλ μλ°μ€ν¬λ¦½νΈμ 곡μμ μΈ λͺ¨λ μ μ€ν
μ΄ μμμ΅λλ€. Node.jsλ require
μ module.exports
λ₯Ό μ¬μ©νλ λ°λ©΄, AMDλ define
ν¨μμ μ½λ°±μ μ¬μ©νμ΅λλ€.
νμ
μ€ν¬λ¦½νΈ μμ module
ν€μλμ 'νΈλ¦¬ν μ¬λμ' μν¬νΈλ₯Ό μ¬μ©νμ΅λλ€. ECMAScript 2015κ° κ³΅μμ μΌλ‘ λͺ¨λ μμ€ν
μ λμ
ν μ΄ν, νμ
μ€ν¬λ¦½νΈλ μΆ©λμ νΌνκΈ° μν΄ module
κ³Ό κ°μ κΈ°λ₯μ νλ namespace
ν€μλλ₯Ό μΆκ°νμ΅λλ€.
namespace foo {
function bar() {}
}
/// <reference path="other.ts" />
foo.bar();
νΈλ¦¬ν μ¬λμ μν¬νΈμ module
ν€μλλ νΈνμ±μ μν΄ λ¨μ μμ λΏμ΄λ©°, μ΄μ λ ECMAScript 2015 μ€νμΌμ λͺ¨λ(import
μ export
)μ μ¬μ©ν΄μΌ ν©λλ€.
λ°μ½λ μ΄ν°β
λ°μ½λ μ΄ν°λ ν΄λμ€, λ©μλ, μμ±μ μ λν
μ΄μ
μ λΆμ΄κ±°λ κΈ°λ₯μ μΆκ°νλ λ° μ¬μ©ν μ μμ΅λλ€. μλ₯Ό λ€μ΄, ν΄λμ€μ λ©μλκ° νΈμΆλ λλ§λ€ λ‘κ·Έλ₯Ό λ¨κΈ°λ €λ©΄ logged
μ λν
μ΄μ
μ μ μν μ μμ΅λλ€.
class Greeter {
greeting: string;
constructor(message: string) {
this.greeting = message;
}
@logged
greet() {
return "Hello, " + this.greeting;
}
}
λ°μ½λ μ΄ν°λ μ²μμ μ΅κ·€λ¬ νλ μμν¬λ₯Ό μ§μνκΈ° μν΄ μΆκ°λμμΌλ©° tsconfig.json
μ experimentalDecorators
μμ±μ μ€μ νκ³ μ¬μ©ν΄μΌ ν©λλ€. νμ¬κΉμ§λ νμ€νκ° μλ£λμ§ μμκΈ° λλ¬Έμ, μ¬μ© μ€μΈ λ°μ½λ μ΄ν°κ° λΉνμ€μΌλ‘ λ°λκ±°λ νΈνμ±μ΄ κΉ¨μ§ κ°λ₯μ±μ΄ μμ΅λλ€. μ΅κ·€λ¬λ₯Ό μ¬μ©νκ±°λ μ λν
μ΄μ
μ΄ νμν νλ μμν¬λ₯Ό μ¬μ©νκ³ μλ κ² μλλΌλ©΄, λ°μ½λ μ΄ν°κ° νμ€μ΄ λκΈ° μ μλ νμ
μ€ν¬λ¦½νΈμμ λ°μ½λ μ΄ν°λ₯Ό μ¬μ©νμ§ μλ κ² μ’μ΅λλ€.
π₯ μμ΄ν 54. κ°μ²΄λ₯Ό μννλ λ Ένμ°β
μ€λ₯μ μμΈμ 무μμΌκΉμ?
const obj = {
one: 'uno',
two: 'dos',
three: 'tres',
};
for (const k in obj) {
const v = obj[k];
// ~~~~~~ objμ μΈλ±μ€ μκ·Έλμ²κ° μκΈ° λλ¬Έμ μ리먼νΈλ μμμ μΌλ‘ any νμ
μ
λλ€.
}
k
μ νμ
μ΄ string
μΈ λ°λ©΄, obj
κ°μ²΄λ one
, two
, three
μΈ κ°μ ν€λ§ μ‘΄μ¬ν©λλ€. k
μ obj
κ°μ²΄μ ν€ νμ
μ΄ μλ‘ λ€λ₯΄κ² μΆλ‘ λμ΄ μ€λ₯κ° λ°μν κ²μ
λλ€.
interface ABC {
a: string;
b: string;
c: number;
}
function foo(abc: ABC) {
for (const k in abc) { // const k: string
const v = abc[k];
// ~~~~~ 'ABC' νμ
μ μΈλ±μ€ μκ·Έλμ²κ° μκΈ° λλ¬Έμ μ리먼νΈλ μμμ μΌλ‘ anyκ° λ©λλ€.
}
}
첫 λ²μ§Έ μμ μ λμΌν μ€λ₯μ
λλ€. κ·Έλ¬λ―λ‘ (let k: keyof ABC)
κ°μ μ μΈμΌλ‘ μ€λ₯λ₯Ό μ κ±°ν μ μμ΅λλ€.
const x = {a: 'a', b: 'b', c: 2, d: new Date()};
foo(x); // μ μ
foo
ν¨μλ ABC
νμ
μ ν λΉ κ°λ₯ν μ΄λ ν κ°μ΄λ 맀κ°λ³μλ‘ νμ©νκΈ° λλ¬Έμ
λλ€.
λν keyof
ν€μλλ₯Ό μ¬μ©ν λ°©λ²μ λ λ€λ₯Έ λ¬Έμ μ μ λ΄ν¬νκ³ μμ΅λλ€.
function foo(abc: ABC) {
let k: keyof ABC;
for (k in abc) {
const v = abc[k]; // string | number νμ
}
}
k
κ° "a" | "b" | "c"
νμ
μΌλ‘ νμ λμ΄ λ¬Έμ κ° λ κ²μ²λΌ, v
λ string | number
νμ
μΌλ‘ νμ λμ΄ λ²μκ° λ무 μ’μ λ¬Έμ κ° λ©λλ€.
κ³¨μΉ μν νμ
λ¬Έμ μμ΄, λ¨μ§ κ°μ²΄μ ν€μ κ°μ μννκ³ μΆλ€λ©΄ Object.entries
λ₯Ό μ¬μ©νλ©΄ λ©λλ€.
function foo(abc: ABC) {
for (const [k, v] of Object.entries(abc)) {
k // string νμ
v // any νμ
}
}
κ°μ²΄λ₯Ό λ€λ£° λλ νμ "νλ‘ν νμ
μ€μΌ"μ κ°λ₯μ±μ μΌλμ λμ΄μΌ ν©λλ€. μ€μ μμ
μμλ Object.prototype
μ μν κ°λ₯ν μμ±μ μ λλ‘ μΆκ°νλ©΄ μ λ©λλ€.
π₯ μμ΄ν 55. DOM κ³μΈ΅ ꡬ쑰 μ΄ν΄νκΈ°β
νμ
μ€ν¬λ¦½νΈμμ DOM μ리먼νΈμ κ³μΈ΅ ꡬ쑰λ₯Ό νμ
νκΈ° μ©μ΄ν©λλ€.
μλ μ½λλ νμ
μ€ν¬λ¦½νΈμμ μλ§μ μ€λ₯κ° νμλ©λλ€.
function handleDrag(eDown: Event) {
const targetEl = eDown.currentTarget;
targetEl.classList.add('dragging');
const dragStart = [eDown.clientX, eDown.clientY];
const handleUp = (eUp: Event) => {
targetEl.classList.remove('dragging');
targetEl.removeEventListener('mouseup', handleUp);
const dragEnd = [eUp.clientX, eUp.clientY];
console.lg('dx, dy = ', [0, 1].map(i => dragEnd[i] - dragStart[i]));
}
targetEl.addEventListener('mouseup', handleUp);
}
const div = document.getElementById('surface');
div.addEventListener('mousedown', handleDrag);
μΌλ°μ μΌλ‘ νμ λ¨μΈλ¬Έμ μ§μν΄μΌ νμ§λ§, DOM κ΄λ ¨ν΄μλ νμ μ€ν¬λ¦½νΈλ³΄λ€ μ°λ¦¬κ° λ μ νν μκ³ μλ κ²½μ°μ΄λ―λ‘ λ¨μΈλ¬Έμ μ¬μ©ν΄λ μ’μ΅λλ€.
document.getElementById('my-div') as HTMLDivElement;
strictNullChecks
κ° μ€μ λ μνλΌλ©΄, document.getElementById
κ° null
μΈ κ²½μ°λ₯Ό 체ν¬ν΄μΌ ν©λλ€. μ€μ μ½λμμ document.getElementById
κ° null
μΌ κ°λ₯μ±μ΄ μλ€λ©΄ if
λΆκΈ°λ¬Έμ μΆκ°ν΄μΌ ν©λλ€.
μλ μμ λ νμ μ€ν¬λ¦½νΈ μ€λ₯λ₯Ό ν΄κ²°ν μμ μ λλ€.
function addDragHandler(el: HTMLElement) {
el.addEventListener('mosuedown', eDown => {
const dragStart = [eDown.clientX, eDown.clientY];
const handleUp = (eUp: MouseEvent) => {
el.classList.remove('dragging');
el.removeEventListener('mouseup', handleUp);
const dragEnd = [eUp.clientX, eUp.clientY];
console.lg('dx, dy = ', [0, 1].map(i => dragEnd[i] - dragStart[i]));
}
el.addEventListener('mouseup', handleUp);
});
}
const div = document.getElementById('surface');
if (div) {
addDragHandler(div);
}
μλ°μ€ν¬λ¦½νΈλ₯Ό μ¬μ©ν λλ μ κ²½ μ°μ§ μμκ² μ§λ§, DOMμλ νμ κ³μΈ΅ κ΅¬μ‘°κ° μμ΅λλ€. DOM νμ μ νμ μ€ν¬λ¦½νΈμμ μ€μν μ 보μ΄λ©°, λΈλΌμ°μ κ΄λ ¨ νλ‘μ νΈμμ νμ μ€ν¬λ¦½νΈλ₯Ό μ¬μ©ν λ μ μ©ν©λλ€.
π₯ μμ΄ν
56. μ 보λ₯Ό κ°μΆλ λͺ©μ μΌλ‘ private
μ¬μ©νμ§ μκΈ°β
class Diary {
private secret = 'cheated on my English test';
}
const diary = new Diary();
diary.secret
// ~~~~~~ 'secret' μμ±μ privateμ΄λ©° 'Diary' ν΄λμ€ λ΄μμλ§ μ κ·Όν μ μμ΅λλ€.
νμ
μ€ν¬λ¦½νΈμλ public
, protected
, private
κ°μ μ κ·Ό μ μ΄μλ νμ
μ€ν¬λ¦½νΈ ν€μλμ΄κΈ° λλ¬Έμ μ»΄νμΌ νμλ μ κ±°λ©λλ€. μ΄ νμ
μ€ν¬λ¦½νΈ μ½λλ₯Ό μ»΄νμΌνκ² λλ©΄ λ€μ μμ μ μλ°μ€ν¬λ¦½νΈ μ½λλ‘ λ³νλ©λλ€.(target=ES2017μ΄ μ€μ λ μν)
class Diary {
constructor() {
this.secret = 'cheated on my English test';
}
}
const diary = new Diary();
diary.secret;
private
ν€μλλ μ¬λΌμ‘κ³ secret
μ μΌλ°μ μΈ μμ±μ΄λ―λ‘ μ κ·Όν μ μμ΅λλ€. νμ
μ€ν¬λ¦½νΈμ μ κ·Ό μ μ΄μλ€μ λ¨μ§ μ»΄νμΌ μμ μλ§ μ€λ₯λ₯Ό νμν΄ μ€ λΏμ΄λ©°, μΈλμ€μ½μ΄ κ΄λ‘μ λ§μ°¬κ°μ§λ‘ λ°νμμλ μλ¬΄λ° ν¨λ ₯μ΄ μμ΅λλ€. μ¬μ§μ΄ λ¨μΈλ¬Έμ μ¬μ©νλ©΄ νμ
μ€ν¬λ¦½νΈ μνμμλ private
μμ±μ μ κ·Όν μ μμ΅λλ€.
class Diary {
private secret = 'cheated on my English test';
}
const diary = new Diary();
(diary as any).secret // μ μ
μ¦, μ 보λ₯Ό κ°μΆκΈ° μν΄ private
μ μ¬μ©νλ©΄ μ λ©λλ€.
μλ°μ€ν¬λ¦½νΈμμ μ 보λ₯Ό μ¨κΈ°κΈ° μν΄ κ°μ₯ ν¨κ³Όμ μΈ λ°©λ²μ ν΄λ‘μ λ₯Ό μ¬μ©νλ κ²μ
λλ€. λ€μ μ½λμ²λΌ μμ±μμμ ν΄λ‘μ λ₯Ό λ§λ€μ΄ λΌ μ μμ΅λλ€.
declare function hash(text: string): number;
class PasswordChecker {
checkPassword: (password: string) => boolean;
constructor(passwordHash: number) {
this.checkPassword = (password: string) => {
return hash(password) === passwordHash;
}
}
}
const checker = new PasswordChecker(hash('s3cret'));
checker.checkPassword('s3cret'); // κ²°κ³Όλ true
λͺ κ°μ§ μ£Όμμ¬νμ΄ μμ΅λλ€. passwordHash
λ₯Ό μμ±μ μΈλΆμμ μ κ·Όν μ μκΈ° λλ¬Έμ, passwordHash
μ μ κ·Όν΄μΌ νλ λ©μλ μμ μμ±μ λ΄λΆμ μ μλμ΄μΌ ν©λλ€. κ·Έλ¦¬κ³ λ©μλ μ μκ° μμ±μ λ΄λΆμ μ‘΄μ¬νλ©΄, μΈμ€ν΄μ€λ₯Ό μμ±ν λλ§λ€ κ° λ©μλμ 볡μ¬λ³Έμ΄ μμ±λκΈ° λλ¬Έμ λ©λͺ¨λ¦¬λ₯Ό λλΉνκ² λλ€λ κ²μ κΈ°μ΅ν΄μΌ ν©λλ€. λν λμΌν ν΄λμ€λ‘λΆν° μμ±λ μΈμ€ν΄μ€λΌκ³ νλλΌλ μλ‘ λΉκ³΅κ° λ°μ΄ν°μ μ κ·Όνλ κ²μ΄ λΆκ°λ₯νκΈ° λλ¬Έμ μ² μ νκ² λΉκ³΅κ°μ΄λ©΄μ λμμ λΆνΈν¨μ΄ λ°λ¦
λλ€.
λ νλμ μ νμ§λ‘, νμ¬ νμ€νκ° μ§ν μ€μΈ λΉκ³΅κ° νλ κΈ°λ₯μ μ¬μ©ν μλ μμ΅λλ€. (μ±
μ μ§ν μ€μ΄λΌκ³ λμ΄μμ§λ§ νμ¬λ νμ€ν μλ£) λΉκ³΅κ° νλ κΈ°λ₯μ μ λμ¬λ‘ #
λ₯Ό λΆμ¬μ νμ
체ν¬μ λ°νμ λͺ¨λμμ λΉκ³΅κ°λ‘ λ§λλ μν μ ν©λλ€.
class PasswordChecker {
#passwordHash: number;
constructor(passwordHash: number) {
this.#passwordHash = passwordHash;
}
checkPassword(password: string) {
return hash(password) === this.#passwordHash;
}
}
const checker = new PasswordChecker(hash('s3cret'));
checker.checkPassword('secret'); // κ²°κ³Όλ false
checker.checkPassword('s3cret'); // κ²°κ³Όλ true
#passwordHash
μμ±μ ν΄λμ€ μΈλΆμμ μ κ·Όν μ μμ΅λλ€. κ·Έλ¬λ ν΄λ‘μ κΈ°λ²κ³Ό λ€λ₯΄κ² ν΄λμ€ λ©μλλ λμΌν ν΄λμ€μ κ° λ³ μΈμ€ν΄μ€λΌλ¦¬λ μ κ·Όμ΄ κ°λ₯ν©λλ€.
π₯ μμ΄ν 57. μμ€λ§΅μ μ¬μ©νμ¬ νμ μ€ν¬λ¦½νΈ λλ²κΉ νκΈ°β
νμ μ€ν¬λ¦½νΈ μ½λλ₯Ό μ€ννλ€λ κ²μ, μλ°ν λ§νμλ©΄ νμ μ€ν¬λ¦½νΈ μ»΄νμΌλ¬κ° μμ±ν μλ°μ€ν¬λ¦½νΈ μ½λλ₯Ό μ€ννλ€λ κ²μ λλ€.
λλ²κΉ μ΄ νμν μμ μ λΉλ‘μ νμ μ€ν¬λ¦½νΈκ° μ§μ μ€νλλ κ²μ΄ μλλΌλ μ¬μ€μ κΉ¨λ«κ² λ κ²λλ€. λλ²κ±°λ λ°νμ μ λμνλ©°, νμ¬ λμνλ μ½λκ° μ΄λ€ κ³Όμ μΌ γΉκ±°μ³μ λ§λ€μ΄μ§ κ²μΈμ§ μμ§ λͺ»ν©λλ€. λλ²κΉ μ νλ©΄ λ³΄κ² λλ μ½λλ μ μ²λ¦¬κΈ°, μ»΄νμΌλ¬, μμΆκΈ°λ₯Ό κ±°μΉ μλ°μ€ν¬λ¦½νΈ μ½λμΌ κ²λλ€. μ΄λ κ² λ³νλ μλ°μ€ν¬λ¦½νΈ μ½λλ 볡μ‘ν΄ λλ²κΉ νκΈ° λ§€μ° μ΄λ ΅μ΅λλ€.
λλ²κΉ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ λΈλΌμ°μ μ μ‘°μ¬λ€μ μλ‘ νλ ₯ν΄ μμ€λ§΅μ΄λΌλ ν΄κ²°μ± μ λ΄λμμ΅λλ€. μμ€λ§΅μ λ³νλ μ½λμ μμΉμ μ¬λ²λ€μ μλ³Έ μ½λμ μλ μμΉμ μ¬λ²λ€λ‘ 맀νν©λλ€. λλΆλΆμ λΈλΌμ°μ μ λ§μ IDEκ° μμ€λ§΅μ μ§μν©λλ€.
μ½λκ° λ³΅μ‘νκ² λ³νλλ€λ©΄ μμ€λ§΅μ΄ νμν©λλ€. νμ
μ€ν¬λ¦½νΈκ° μμ€λ§΅μ μμ±ν μ μλλ‘ tsconfig.json
μμ sourceMap
μ΅μ
μ μ€μ ν μ μμ΅λλ€.
{
"compilerOptions": {
"sourceMap": true,
}
}
μ΄μ μ»΄νμΌμ μ€ννλ©΄ κ° .ts
νμΌμ λν΄μ .js
μ .js.map
λ κ°μ νμΌμ μμ±ν©λλ€. .js.map
νμΌμ΄ λ°λ‘ μμ€λ§΅μ
λλ€.
μμ€λ§΅μ λν΄ μμμΌ ν λͺ κ°μ§ μ¬νμ΄ μμ΅λλ€.
- μ΄μμ μΈ λλ²κΉ νκ²½μ΄ λλ €λ©΄ μμ±λ μλ°μ€ν¬λ¦½νΈκ° μλ μλ³Έ νμ μ€ν¬λ¦½νΈ μμ€λ‘ 맀νλλλ‘ ν΄μΌ ν©λλ€. λ²λ€λ¬κ° κΈ°λ³Έμ μΌλ‘ νμ μ€ν¬λ¦½νΈλ₯Ό μ§μνλ€λ©΄ λ³λ μ€μ μμ΄ μ λμν΄μΌ ν©λλ€. κ·Έλ μ§ μλ€λ©΄ λ²λ€λ¬κ° μμ€λ§΅μ μΈμν μ μλλ‘ μΆκ°μ μΈ μ€μ μ΄ νμν©λλ€.
- μμ© νκ²½μ μμ€λ§΅μ΄ μ μΆλκ³ μλμ§ νμΈν΄μΌ ν©λλ€. λλ²κ±°λ₯Ό μ΄μ§ μλ μ΄μμ μμ€λ§΅μ΄ λ‘λλμ§ μμΌλ―λ‘, μ€μ μ¬μ©μμκ² μ±λ₯ μ νλ λ°μνμ§ μμ΅λλ€. κ·Έλ¬λ μμ€λ§΅μ μλ³Έ μ½λμ μΈλΌμΈ 볡μ¬λ³Έμ΄ ν¬ν¨λμ΄ μλ€λ©΄ 곡κ°ν΄μλ μ λ λ΄μ©μ΄ λ€μ΄ μμ μ μμ΅λλ€.
νμ μ²΄μ»€κ° μ½λλ₯Ό μ€ννκΈ° μ μ λ§μ μ€λ₯λ₯Ό μ‘μ μ μμ§λ§, λλ²κ±°λ₯Ό λ체ν μλ μμ΅λλ€. μμ€λ§΅μ μ¬μ©ν΄μ μ λλ‘ λ νμ μ€ν¬λ¦½νΈ λλ²κΉ νκ²½μ ꡬμΆνκΈΈ λ°λλλ€.