π€ Chapter 2: νμ μ€ν¬λ¦½νΈμ νμ μμ€ν
π₯ μμ΄ν 6. νΈμ§κΈ°λ₯Ό μ¬μ©νμ¬ νμ μμ€ν νμνκΈ°β
- νΈμ§κΈ°μμ νμ μ€ν¬λ¦½νΈ μΈμ΄ μλΉμ€λ₯Ό μ κ·Ή νμ©ν΄μΌ ν©λ λ€.
- νΈμ§κΈ°λ₯Ό μ¬μ©νλ©΄ μ΄λ»κ² νμ μμ€ν μ΄ λμνλμ§, κ·Έλ¦¬κ³ νμ μ€ν¬λ¦½νΈκ° μ΄λ»κ² νμ μ μΆλ‘ νλμ§ κ°λ μ μ‘μ μ μμ΅λλ€.
- νμ μ€ν¬λ¦½νΈκ° λμμ μ΄λ»κ² λͺ¨λΈλ§νλμ§ μκΈ° μν΄ νμ μ μΈ νμΌμ μ°Ύμ보λ λ°©λ²μ ν°λν΄μΌ ν©λλ€.
π₯ μμ΄ν 7. νμ μ΄ κ°λ€μ μ§ν©μ΄λΌκ³ μκ°νκΈ°β
λ°νμμ λͺ¨λ λ³μλ μλ°μ€ν¬λ¦½νΈ μΈμμ κ°μΌλ‘λΆν° μ ν΄μ§λ κ°μμ κ³ μ ν κ°μ κ°μ§λλ€. λ³μμλ λ€μμ²λΌ λ€μν μ’ λ₯μ κ°μ ν λΉν μ μμ΅λλ€.
42
null
undefined
'Canada'
{ animal: 'Whale', weight_lbs: 40_000 }
/regex/
new HTMLButtonElement
(x, y) => x + y
κ·Έλ¬λ μ½λκ° μ€νλκΈ° μ , μ¦ νμ μ€ν¬λ¦½νΈκ° μ€λ₯λ₯Ό 체ν¬νλ μκ°μλ "νμ "μ κ°μ§κ³ μμ΅λλ€. "ν λΉ κ°λ₯ν κ°λ€μ μ§ν©"μ΄ νμ μ΄λΌκ³ μκ°νλ©΄ λ©λλ€. μ΄ μ§ν©μ νμ μ "λ²μ"λΌκ³ λΆλ₯΄κΈ°λ ν©λλ€.
κ°μ₯ μμ μ§ν©μ μ무 κ°λ ν¬ν¨νμ§ μλ 곡μ§ν©μ΄λ©°, νμ
μ€ν¬λ¦½νΈμμλ never
νμ
μ
λλ€. never
νμ
μΌλ‘ μ μΈλ λ³μμ λ²μλ 곡μ§ν©μ΄κΈ° λλ¬Έμ μλ¬΄λ° κ°λ ν λΉν μ μμ΅λλ€.
κ·Έλ€μμΌλ‘ μμ μ§ν©μ ν κ°μ§ κ°λ§ ν¬ν¨νλ ν μ μ λλ€. μ΄λ€μ νμ μ€ν¬λ¦½νΈμμ μ λ(unit) νμ μ΄λΌκ³ λ λΆλ¦¬λ 리ν°λ΄ νμ μ λλ€.
type A = 'A';
type B = 'B';
type Twelve = 12;
λ κ° νΉμ μΈ κ°λ‘ λ¬ΆμΌλ €λ©΄ μ λμ¨ νμ μ μ¬μ©ν©λλ€. μ λμ¨ νμ μ κ° μ§ν©λ€μ ν©μ§ν©μ μΌμ»«μ΅λλ€.
type AB = 'A' | 'B';
type AB12 = 'A' | 'B' | 12;
νμ
μ΄ μ§ν©μ΄λΌλ κ΄μ μμ extends
μ μλ―Έλ ~μ ν λΉ κ°λ₯νκ³Ό λΉμ·νκ², ~μ λΆλΆ μ§ν©μ΄λΌλ μλ―Έλ‘ λ°μλ€μΌ μ μμ΅λλ€.
interface Vector1D { x: number; }
interface Vector2D extends Vector1D { y: number; }
interface Vector3D extends Vector2D { z: number; }
Vector3D
λ Vector2D
μ μλΈνμ
μ΄κ³ Vector2D
λ Vector1D
μ μλΈνμ
μ
λλ€.
extends
ν€μλλ μ λλ¦ νμ
μμ νμ μλ‘λ μ°μ΄λ©°, μ΄ λ¬Έλ§₯μμλ "~μ λΆλΆ μ§ν©"μ μλ―ΈνκΈ°λ ν©λλ€.
function getKey<K extends string>(val: any, key: K) {
// ...
}
string
μ λΆλΆ μ§ν© λ²μλ₯Ό κ°μ§λ μ΄λ ν νμ
μ΄ λ©λλ€. μ΄ νμ
μ string
리ν°λ΄ νμ
, string
리ν°λ΄ νμ
μ μ λμ¨, string
μμ μ ν¬ν¨ν©λλ€.
getKey({}, 'x'); // μ μ, stringμ μμ
getKey({}, Math.random() < 0.5 ? 'a' : 'b'); // μ μ, stringμ μμ
getKey({}, document.title); // μ μ
getKey({}, 12); // ~~~ '12' νμμ μΈμλ 'string' νμμ 맀κ°λ³μμ ν λΉλ μ μμ΅λλ€.
νμ μ΄ κ°μ μ§ν©μ΄λΌλ 건, λμΌν κ°μ μ§ν©μ κ°μ§λ λ νμ μ κ°λ€λ μλ―Έκ° λ©λλ€. λ νμ μ΄ μλ―Έμ μΌλ‘ λ€λ₯΄κ³ μ°μ°ν κ°μ λ²μλ₯Ό κ°μ§λ€κ³ νλλΌλ, κ°μ νμ μ λ λ² μ μν μ΄μ λ μμ΅λλ€.
π₯ μμ΄ν 8. νμ 곡κ°κ³Ό κ° κ³΅κ°μ μ¬λ² ꡬλΆνκΈ°β
νμ μ€ν¬λ¦½νΈ μ¬λ²μ νμ 곡κ°μ΄λ κ° κ³΅κ° μ€μ ν κ³³μ μ‘΄μ¬ν©λλ€. μ¬λ²μ μ΄λ¦μ΄ κ°λλΌλ μνλ 곡κ°μ λ°λΌ λ€λ₯Έ κ²μ λνλΌ μ μκΈ° λλ¬Έμ νΌλμ€λ¬μΈ μ μμ΅λλ€.
interface Cylinder {
radius: number;
height: number;
}
const Cylinder = (radius: number, height: number) => ({ radius, height });
interface Cylinder
μμ Cylinder
λ νμ
μΌλ‘ μ°μ
λλ€. const Cylinder
μμ Cylinder
μ μ΄λ¦μ κ°μ§λ§ κ°μΌλ‘ μ°μ΄λ©°, μλ‘ μλ¬΄λ° κ΄λ ¨λ μμ΅λλ€. μν©μ λ°λΌμ Cylinder
λ νμ
μΌλ‘ μ°μΌ μλ μκ³ , κ°μΌλ‘ μ°μΌ μλ μμ΅λλ€. μ΄λ° μ μ κ°λ μ€λ₯λ₯Ό μΌκΈ°ν©λλ€.
ν μ¬λ²μ΄ νμ μΈμ§ κ°μΈμ§λ μΈλ» λ΄μ μ μ μμ΅λλ€. μ΄λ€ ννλ‘ μ°μ΄λμ§ λ¬Έλ§₯μ μ΄ν΄ μμλ΄μΌ ν©λλ€. λ§μ νμ μ½λκ° κ° μ½λμ λΉμ·ν΄ 보μ΄κΈ° λλ¬Έμ λλμ± νΌλμ€λ½μ΅λλ€.
type T1 = typeof p; // νμ
μ Person
type T2 = typeof email; // νμ
μ (p: Person, subject: string, body: string) => Response
const v1 = typeof p; // κ°μ "object"
const v2 = typeof email; // κ°μ "function"
νμ
μ κ΄μ μμ, typeof
λ κ°μ μ½μ΄μ νμ
μ€ν¬λ¦½νΈ νμ
μ λ°νν©λλ€. νμ
κ³΅κ° μ typeof
λ λ³΄λ€ ν° νμ
μ μΌλΆλΆμΌλ‘ μ¬μ©ν μ μκ³ , type
ꡬ문μΌλ‘ μ΄λ¦μ λΆμ΄λ μ©λλ‘λ μ¬μ©ν μ μμ΅λλ€.
κ°μ κ΄μ μμ typeof
λ μλ°μ€ν¬λ¦½νΈ λ°νμμ typeof
μ°μ°μκ° λ©λλ€. κ° κ³΅κ°μ typeof
λ λμ μ¬λ²μ λ°νμ νμ
μ κ°λ¦¬ν€λ λ¬Έμμ΄μ λ°ννλ©°, νμ
μ€ν¬λ¦½νΈ νμ
κ³Όλ λ€λ¦
λλ€. μλ°μ€ν¬λ¦½νΈμ λ°νμ νμ
μμ€ν
μ νμ
μ€ν¬λ¦½νΈμ μ μ νμ
μμ€ν
λ³΄λ€ ν¨μ¬ κ°λ¨ν©λλ€. νμ
μ€ν¬λ¦½νΈ νμ
μ μ’
λ₯κ° λ¬΄μν λ§μ λ°λ©΄, μλ°μ€ν¬λ¦½νΈμλ κ³Όκ±°λΆν° μ§κΈκΉμ§ λ¨ 6κ°(string
, number
, boolean
, undefined
, object
, function
)μ λ°νμ νμ
λ§μ΄ μ‘΄μ¬ν©λλ€.
λ κ³΅κ° μ¬μ΄μμ λ€λ₯Έ μλ―Έλ₯Ό κ°μ§λ μ½λ ν¨ν΄λ€μ΄ μμ΅λλ€.
- κ°μΌλ‘ μ°μ΄λ
this
λ μλ°μ€ν¬λ¦½νΈμthis
ν€μλμ λλ€. νμ μΌλ‘ μ°μ΄λthis
λ, μΌλͺ "λ€νμ±this
"λΌκ³ λΆλ¦¬λthis
μ νμ μ€ν¬λ¦½νΈ νμ μ λλ€. - κ°μμ
&
μ|
λAND
μOR
λΉνΈμ°μ°μ λλ€. νμ μμλ μΈν°λ μ κ³Ό μ λμ¨μ λλ€. const
λ μ λ³μλ₯Ό μ μΈνμ§λ§,as const
λ 리ν°λ΄ λλ 리ν°λ΄ ννμμ μΆλ‘λ νμ μ λ°κΏλλ€.extends
λ μλΈν΄λμ€(class A extends B
) λλ μλΈνμ (interface A extends B
) λλ μ λλ¦ νμ νμ μ(Generic<T extends number>
)λ₯Ό μ μν μ μμ΅λλ€.in
μ 루ν λλ 맀νλ νμ μ λ±μ₯ν©λλ€.
π₯ μμ΄ν 9. νμ λ¨μΈλ³΄λ€λ νμ μ μΈμ μ¬μ©νκΈ°β
νμ μ€ν¬λ¦½νΈμμ λ³μμ κ°μ ν λΉνκ³ νμ μ λΆμ¬νλ λ°©λ²μ λ κ°μ§μ λλ€.
interface Person { name: string };
const alice: Person = { name: 'Alice' };
const bob = { name: 'Bob' } as Person;
첫 λ²μ§Έ alice: Person
μ λ³ μμ νμ
μ μΈμ λΆμ¬μ κ·Έ κ°μ΄ μ μΈλ νμ
μμ λͺ
μν©λλ€. λ λ²μ§Έ as Person
μ νμ
λ¨μΈμ μνν©λλ€. κ·Έλ¬λ©΄ νμ
μ€ν¬λ¦½νΈκ° μΆλ‘ ν νμ
μ΄ μλλΌλ Person
νμ
μΌλ‘ κ°μ£Όν©λλ€.
νμ
λ¨μΈλ³΄λ€ νμ
μ μΈμ μ¬μ©νλ κ² λ«μ΅λλ€. κ·Έ μ΄μ λ λ€μ μ½λμμ νμΈν μ μμ΅λλ€.
const alice: Person = {}; // ~~~ 'Person' μ νμ νμν 'name' μμ±μ΄ '{}' μ νμ μμ΅λλ€.
const bob = {} as Person; // μ€λ₯ μμ
νμ μ μΈμ ν λΉλλ κ°μ΄ ν΄λΉ μΈν°νμ΄μ€λ₯Ό λ§μ‘±νλμ§ κ²μ¬ν©λλ€. μμ μμ μμλ κ·Έλ¬μ§ λͺ»νκΈ° λλ¬Έμ νμ μ€ν¬λ¦½νΈκ° μ€λ₯λ₯Ό νμνμ΅λλ€. νμ λ¨μΈμ κ°μ λ‘ νμ μ μ§μ νμΌλ νμ 체컀μκ² μ€λ₯λ₯Ό 무μνλΌκ³ νλ κ²μ λλ€.
νμ λ¨μΈμ΄ κΌ νμν κ²½μ°κ° μλλΌλ©΄, μμ μ± μ²΄ν¬λ λλ νμ μ μΈμ μ¬μ©νλ κ²μ΄ μ’μ΅λλ€.
νμ΄ν ν¨μμ νμ
μ μΈμ μΆλ‘ λ νμ
μ΄ λͺ¨νΈν λκ° μμ΅λλ€. μλ₯Ό λ€μ΄, λ€μ μ½λμμ Person
μΈν°νμ΄μ€λ₯Ό μ¬μ©νκ³ μΆλ€κ³ κ°μ ν΄ λ³΄κ² μ΅λλ€.
const people = ['alice', 'bob', 'jan'].map(name => ({ name }));
// Person[]μ μνμ§λ§ κ²°κ³Όλ { name: string; }[]
λ€μκ³Ό κ°μ΄ νμ΄ν ν¨μ μμμ νμ κ³Ό ν¨κ» λ³μλ₯Ό μ μΈνλ κ²μ΄ κ°μ₯ μ§κ΄μ μ λλ€.
const people = ['alice', 'bob', 'jan'].map(name => {
const person: Person = { name };
return person;
}); // νμ
μ Person[]
μ½λλ₯Ό μ’ λ κ°κ²°νκ² λ³΄μ΄κΈ° μν΄ λ³μ λμ νμ΄ν ν¨μμ λ°ν νμ μ μ μΈν΄ λ³΄κ² μ΅λλ€.
const people = ['alice', 'bob', 'jan'].map((name): Person => ({ name })); // νμ
μ Person[]
μ΄ μ½λλ λ°λ‘ μμ λ²μ‘ν λ²μ κ³Ό λμΌν 체ν¬λ₯Ό μνν©λλ€. μ¬κΈ°μ μκ΄νΈλ λ§€μ° μ€μν μλ―Έλ₯Ό μ§λλλ€. name
μ νμ
μ΄ μκ³ , λ°ν νμ
μ΄ Person
μ΄λΌκ³ λͺ
μν©λλ€. κ·Έλ¬λ (name: Person)
μ name
μ νμ
μ΄ Person
μμ λͺ
μνκ³ λ°ν νμ
μ μκΈ° λλ¬Έμ μ€λ₯κ° λ°μν©λλ€.
λ€μ μ½λλ μ΅μ’
μ μΌλ‘ μνλ νμ
μ μ§μ λͺ
μνκ³ , νμ
μ€ν¬λ¦½νΈκ° ν λΉλ¬Έμ μ ν¨μ±μ κ²μ¬νκ² ν©λλ€.
const people: Person[] = ['alice', 'bob', 'jan'].map((name): Person => ({ name })); // νμ
μ Person[]
κ·Έλ¬λ ν¨μ νΈμΆ 체μ΄λμ΄ μ°μλ κ³³μλ 체μ΄λ μμμμλΆν° λͺ λͺ λ νμ μ κ°μ ΈμΌ ν©λλ€. κ·ΈλμΌ μ νν κ³³μ μ€λ₯κ° νμλ©λλ€.
λ€μμΌλ‘ νμ λ¨μΈμ΄ κΌ νμν κ²½μ°λ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€. νμ λ¨μΈμ νμ μ²΄μ»€κ° μΆλ‘ ν νμ λ³΄λ€ μ¬λ¬λΆμ΄ νλ¨νλ νμ μ΄ λ μ νν λ μλ―Έκ° μμ΅λλ€. μλ₯Ό λ€μ΄, DOM μ리먼νΈμ λν΄μλ νμ μ€ν¬λ¦½νΈλ³΄λ€ μ¬λ¬λΆμ΄ λ μ νν μκ³ μμ κ²λλ€.
document.querySelector('#myButton').addEventListener('click', (e) => {
e.currentTarget // νμ
μ EventTarget
const button = e.currentTarget as HTMLButtonElement;
button // νμ
μ HTMLButtonElement
});
νμ
μ€ν¬λ¦½νΈλ DOMμ μ κ·Όν μ μκΈ° λλ¬Έμ #myButton
μ΄ λ²νΌ μ리먼νΈμΈμ§ μμ§ λͺ»ν©λλ€. κ·Έλ¦¬κ³ μ΄λ²€νΈμ currentTarget
μ΄ κ°μ λ²νΌμ΄μ΄μΌ νλ κ²λ μμ§ λͺ»ν©λλ€. μ°λ¦¬λ νμ
μ€ν¬λ¦½νΈκ° μμ§ λͺ»νλ μ 보λ₯Ό κ°μ§κ³ μκΈ° λλ¬Έμ μ¬κΈ°μλ νμ
λ¨μΈλ¬Έμ μ°λ κ²μ΄ νλΉν©λλ€.
π₯ μμ΄ν 10. κ°μ²΄ λνΌ νμ νΌνκΈ°β
κΈ°λ³Ένλ€μ λΆλ³μ΄λ©° λ©μλλ₯Ό κ°μ§μ§ μλλ€λ μ μμ κ°μ²΄μ ꡬλΆλ©λλ€. κ·Έλ°λ° κΈ°λ³ΈνμΈ string
μ κ²½μ° λ©μλλ₯Ό κ°μ§κ³ μλ κ²μ²λΌ 보μ
λλ€. νμ§λ§ μ¬μ€ string
μ λ©μλκ° μλλ©°, string
μ μ¬μ©ν λ μλ°μ€ν¬λ¦½νΈ λ΄λΆμ μΌλ‘ λ§μ λμμ΄ μΌμ΄λ©λλ€. string
κΈ°λ³Ένμλ λ©μλκ° μμ§λ§, μλ°μ€ν¬λ¦½νΈμλ λ©μλλ₯Ό κ°μ§λ String
κ°μ²΄ νμ
μ΄ μ μλμ΄ μμ΅λλ€. μλ°μ€ν¬λ¦½νΈλ κΈ°λ³Ένκ³Ό κ°μ²΄ νμ
μ μλ‘ μμ λ‘κ² λ³νν©λλ€. string
κΈ°λ³Ένμ charAt
κ°μ λ©μλλ₯Ό μ¬μ©ν λ, μλ°μ€ν¬λ¦½νΈλ κΈ°λ³Ένμ String
κ°μ²΄λ‘ λννκ³ , λ©μλλ₯Ό νΈμΆνκ³ , λ§μ§λ§μ λνν κ°μ²΄λ₯Ό λ²λ¦½λλ€.
λ§μ½ String.prototype
μ λͺ½ν€-ν¨μΉνλ€λ©΄ μμ μ€λͺ
ν λ΄λΆμ μΈ λμλ€μ κ΄μ°°ν μ μμ΅λλ€.
λͺ½ν€-ν¨μΉλ λ°νμμ νλ‘κ·Έλ¨μ μ΄λ€ κΈ°λ₯μ μμ ν΄μ μ¬μ©νλ κΈ°λ²μ μλ―Έν©λλ€. μλ°μ€ν¬λ¦½νΈμμλ μ£Όλ‘ νλ‘ν νμ μ λ³κ²½νλ κ²μ΄ ν΄λΉν©λλ€.
λ©μλ λ΄μ this
λ string
κΈ°λ³Ένμ΄ μλ String
κ°μ²΄ λνΌμ
λλ€. String
κ°μ²΄λ₯Ό μ§μ μμ±ν μλ μμΌλ©°, string
κΈ°λ³Ένμ²λΌ λμν©λλ€. κ·Έλ¬λ string
κΈ°λ³Ένκ³Ό String
κ°μ²΄ λνΌκ° νμ λμΌνκ² λμνλ κ²μ μλλλ€. μλ₯Ό λ€μ΄, String
κ°μ²΄λ μ€μ§ μκΈ° μμ νκ³ λ§ λμΌν©λλ€.
"hello" === new String("hello"); // false
new String("hello") === new String("hello"); // false
π₯ μμ΄ν 11. μμ¬ μμ± μ²΄ν¬μ νκ³ μΈμ§νκΈ°β
νμ μ΄ λͺ μλ λ³μμ κ°μ²΄ 리ν°λ΄μ ν λΉν λ νμ μ€ν¬λ¦½νΈλ ν΄λΉ νμ μ μμ±μ΄ μλμ§, κ·Έλ¦¬κ³ 'κ·Έ μΈμ μμ±μ μλμ§' νμΈν©λλ€.
interface Room {
numDoors: number;
ceilingHeightFt: number;
}
const r: Room = {
numDoors: 1,
ceilingHeightFt: 10,
elephant: 'present', // κ°μ²΄ 리ν°λ΄μ μ λ €μ§ μμ±λ§ μ§μ ν μ μμΌλ©° 'Room' νμμ 'elephant'κ° μμ΅λλ€.
}
Room
νμ
μ μλ±λ§κ² elephant
μμ±μ΄ μλ κ²μ΄ μ΄μνκΈ΄ νμ§λ§, ꡬ쑰μ νμ΄ν κ΄μ μΌλ‘ μκ°ν΄ 보면 μ€λ₯κ° λ°μνμ§ μμμΌ ν©λλ€. μμ λ³μλ₯Ό λμ
ν΄ λ³΄λ©΄ μ μ μλλ°, obj
κ°μ²΄λ Room
νμ
μ ν λΉμ΄ κ°λ₯ν©λλ€.
const obj = {
numDoors: 1,
ceilingHeightFt: 10,
elephant: 'present',
};
const r: Room = obj; // μ μ