κΉν TIL λ ν¬μ κΈ°λ‘νλ λ΄μ©μ μ 리νμ¬ λΈλ‘κΉ ν©λλ€.
νμ μ€ν¬λ¦½νΈ μ΄λ νμ
μ΄λμ κΈ°λ³Έ
μ΄λμ μλ°μ€ν¬λ¦½νΈ κ°λ°μμκ²λ μ λ§ μμν κ°λ
μ΄λ€. μκΈ΄μμ μ²μ λ΄€μλμ λλμ κ°μ²΄μ λ°°μ΄μ μμ μλ‘μ΄ μλ£ν νμ
μ΄λΌλ κ²μ΄λ€. κ·Όλ° κ·Έ λλμ΄ μΌμΆ λ§λ€.
Enumμ νΉμ κ°λ€μ μ§ν©μ μλ―Ένλ€. μ¬μ© λ°©μμ μΈν°νμ΄μ€μ λΉμ·νλ°, enum νμ
μ΄λ¦ {}
ννλ‘ μ μ©ν μ μλ€. νμ
μ€ν¬λ¦½νΈμμλ μ«μνκ³Ό λ¬Έμν μ΄λμ μ§μνλ€. λ ννλ₯Ό 볡ν©μ μΌλ‘ μ¬μ©νλ 볡ν©ν μ΄λμ΄ μμ§λ§, κ°κΈμ μ΄λ©΄ κ°μ ννλ‘ μ μνλ κ²μ΄ μ’λ€.
μ«μν μ΄λ
μ«μν μ΄λμ κΈ°λ³Έ μ΄κΈ°κ°μ΄ λ°°μ΄μ μΈλ±μ€μ²λΌ 0μ΄λ€. κ·Έλ¦¬κ³ μ΄κΈ°κ°μ κΈ°μ€μΌλ‘ 1μ© λμ΄κ°λ€. λ°°μ΄κ³Όμ μ°¨μ΄μ μ μ΄κΈ°κ°μ κ°λ°μκ° μ§μ ν μ μλ€λ μ μ΄λ€. μ¬μ©λ°©λ²μ κ°μ²΄λ₯Ό λ€λ£¨λ κ²κ³Ό λΉμ·νλ€.
μ«μν μ΄λμ 리λ²μ€ 맡νμ μ§μνλ€. μ΄λμ λ±λ‘λ κ°κ°μ ν€μ κ°μΌλ‘ μλ‘μ κ°μ μ»μ μ μλ κ²μ΄λ€. μ«μν μ΄λλ§ κ°λ₯νλ€.
// up ~ left μμλ‘ 1 ~ 4κ° μ§μ λλ€.
enum Direction {
up = 1,
right,
down,
left,
}
function robotWork(command: string, work: Direction): void {
...
}
robotWork('robot go straight', Direction.right);
// reverse mapping
const upValue = Direction.up;
const upKey = Direction[upValue];
λ¬Έμν μ΄λ
λ¬Έμν μ΄λμ μ«μν μ΄λκ³Ό μ μνκ³ μ¬μ©νλ λ°©λ²μ΄ λΉμ·νλ€. μ°¨μ΄μ μ μ«μνμ κ²½μ° μ μΌ μ²« μμμκ² μ΄κΈ°κ°μ μ§μ νλ©΄ μλμΌλ‘ κ·Έ κ°μ΄ μ¦κ°νμ¬ λΆμ¬λμ§λ§, λ¬Έμν μ΄λμ κ° μμμ λͺ
νν κ°μΌλ‘ μ΄κΈ°νκ° νμνλ€.
enum Direction {
up = "up"
right = "right"
down = "down"
left = "left"
}
νμ μ€ν¬λ¦½νΈ ν΄λμ€μ νμ
κΈ°λ³Έμ μΌλ‘ μλ°μ€ν¬λ¦½νΈλ‘ ν΄λμ€λ₯Ό μ μνλ κ²κ³Ό λΉμ·νλ€.
ν΄λμ€ λ΄λΆμ λ§΄λ² λ³μ, κ°μ²΄κ° μμ±λ λ νΈμΆλλ μμ±μ 컨μ€νΈλν°(constructor), κ·Έλ¦¬κ³ νΉμ λμμ λ§λλ λ©μλκΉμ§, ν΄λμ€λ₯Ό μ μνλ λ°©λ²μμ νμ
μ€ν¬λ¦½νΈλ μλ°μ€ν¬λ¦½νΈμ λΉμ·νλ€. extends
ν€μλλ‘ ν΄λμ€ μμμ λ°λ κ²λ λμΌνλ€.
class Person {
// λ©€λ² λ³μ
name: string;
constructor(name: string) {
// λ©€λ² λ³μ μ΄κΈ°ν
this.name = name;
}
sayHello() {
console.log(`hi, i am ${this.name}`);
}
}
class Hankyeol extends Person {
constructor(name: string) {
// μμλ°μ μμ ν΄λμ€μμ
// constructorλ₯Ό μ¬μ©νλ €λ©΄ λ°λμ super ν€μλλ₯Ό μ¬μ©ν΄μΌ νλ€.
// superλ λΆλͺ¨ ν΄λμ€μ constructorλ₯Ό νΈμΆνλ€.
super(name);
}
}
ν€μλλ‘ λ©€λ² λ³μ κ³΅κ° λ²μ μ νκΈ°
νμ
μ€ν¬λ¦½νΈλ₯Ό μ¬μ©νλ©΄ ν΄λμ€λ₯Ό ν΅ν κ°μ²΄ μμ± λ° μμμμ λΆλͺ¨ ν΄λμ€μ λ©€λ² λ³μ, λ©μλμ κ³΅κ° λ²μλ₯Ό μ§μ ν μ μλ€. private
, protected
, public
μ΄λΌλ ν€μλλ₯Ό λ©€λ² λ³μ μμ λΆμ¬ μ§μ νλ€.
public
μ λ¨μ΄ λ» κ·Έλλ‘ μΈλΆμλ λ ΈμΆλκ³ μμμμ μμ ν΄λμ€μλ λ ΈμΆλλ λ²μλ₯Ό μ§μ νλ€. ν€μλ μμ΄ ν΄λμ€λ₯Ό μμ±ν λ, publicμ΄ λν΄νΈλΌκ³ μκ°νλ©΄ νΈνλ€.private
λ κ°μΈμ μ΄λΌλ λ»μ²λΌ, μΈλΆμλ λ ΈμΆλμ§ μκ³ μμμ΄ λλ μμ ν΄λμ€μλ λ ΈμΆλμ§ μλλ€.#
κΈ°νΈλ‘ μ¬μ©ν μ μλ€. (# κΈ°νΈλ μ΅κ·Όμ μΆκ°λ μλ°μ€ν¬λ¦½νΈμ νμ€μ΄λ€.)protected
ν€μλλ μμλ°λ ν΄λμ€μλ§ λ ΈμΆλλ λ²μλ₯Ό μ§μ νλ€. μΈλΆμμλ μ κ·Όν μ μλλ‘ λ³΄νΈνλ μμ΄λ€. constructorμ λΆμ΄λ©΄ μΈλΆμμ κ°μ²΄λ₯Ό μμ±νμ§ λͺ»νλλ‘ λ§μ μ μλ€.readonly
μμ± μμ μλ€. constructorλ‘ λ©€λ² λ³μμ μ²μ κ°μ ν λΉν μ΄νμλ κ°μ λ³κ²½ν μ μλ€.
class Shark {
protected familyMember: string;
public character: string;
private constructor(familyMember: string, character: string) {
...
}
}
const babyShark = new Shark('baby', 'charm') // Error: constructor is private
λ©€λ² λ³μ μ§μ μλ΅νκΈ°
λ©€λ² λ³μλ₯Ό μ§μ νκ³ , constructorλ‘ μ΄κΈ°ν ν΄μ£Όλ μ½λλ₯Ό λ§€λ² μμ±νλ κ²μ μ λ§ λ²κ±°λ‘μ΄ μΌμ΄λ€. μμμ λ©€λ² λ³μ μ¬μ© λ²μλ₯Ό κ²°μ νλ ν€μλλ₯Ό μ΄μ©ν΄μ νμ
μ€ν¬λ¦½νΈλ‘ ν΄λμ€λ₯Ό μ‘°κΈ λ νΈνκ² μμ±ν μ μλ€.
constructor ν¨μμ μΈμμ λ€μ΄μ€λ μΈμμ μ¬μ© λ²μμ λν ν€μλλ₯Ό λΆμ¬μ£Όλ©΄ λλ€.
class Shark {
constructor(public character: string) {
// publicμΌλ‘ μ μν μμλ μλμΌλ‘ λ©€λ² λ³μλ‘ μΈμνλ€.
// thisλ‘ μ΄κΈ°ν νλ μ½λλ νμμλ€.
}
}
static, abstract ν€μλ
class λ΄λΆμμ staticμΌλ‘ μ μλ λ©€λ² λ³μμ λ©μλλ μ λμ μΈ κ°μ΄λΌκ³ μκ°νλ©΄ νΈνλ€. ν΄λμ€λ‘ μμ±λλ μ΄λ€ κ°μ²΄μλ μκ΄μμ΄ λ΄λΆμμ κ³ μ λ κ°μ΄λ€. static ν€μλλ‘ μ μλ λ³μ, λ©μλλ μμ μ μ μ΄λΌλ λ§μ΄ λΆλλ€. (μ μ λ©€λ² λ³μ, μ μ λ©μλ)
μ μ λ©€λ² λ³μμ μ μ λ©μλλ ν΄λμ€λͺ
.λ³μ/λ©μλ
ννλ‘ ν΄λμ€ μ΄λ¦ μ체μ λΆμ΄μ νΈμΆνκ³ μ¬μ©νλ€.
class Shark {
static maxAge = 150;
constructor(public age: number) {}
eatHuman(): string {
// eatingAge λ©μλλ μ μ λ©μλλΌ μλμ κ°μ΄ μ¬μ©νλ€.
return Shark.eatingAge(this.age) ? 'yammy' : 'Hmm..';
}
static eatingAge(age: number): boolean {
// maxAge λ³μλ μ μ λ©€λ² λ³μλΌ 'ν΄λμ€λͺ
.λ³μ'λ‘ νΈμΆνλ€.
return Shark.maxAge <= 50;
}
}
abstract ν€μλκ° λΆμ ν΄λμ€λ new ν€μλλ‘ κ°μ²΄λ₯Ό μμ±ν μ μλ€. λ§ κ·Έλλ‘ ν΄λμ€κ° μΆμν λλ€λ λλμ΄λ€. λν abstractλ ν΄λμ€ λ΄λΆμμ μ μλ λ©μλ μμλ λΆμ μ μλ€. κ·Έ ν΄λμ€λ₯Ό μμ λ°λ μμ ν΄λμ€μμλ abstractκ° λΆμ λ©μλλ₯Ό λ°λμ μ μν΄μ£Όμ΄μΌ νλ€.
abstract class Aligator { ... }
const aligator = new Aligator // Error: cannot create an instance of abstract class
class Shark {
...
abstract eatHuman() {};
}
class BabyShark extends Shark {
...
eatHuman() {...}
}
νμ μ€ν¬λ¦½νΈ νμ νΈνμ±
ν λΉν μ μλ νμ /κ°μ λ²μλ‘ λ°μ§λ©΄ νΈνλ€.
νμ
νΈνμ±μ μ μ νμ
μΈμ΄κ° κ°μ§λ νΉμ±μ΄λ€. μ΄λ€ νμ
μ λ€λ₯Έ νμ
μΌλ‘ μ·¨κΈν μ μμμ§? νΈνν΄μ μ¬μ©ν μ μμμ§λ₯Ό νλ¨ν΄μ£Όλ νΉμ±μ΄λΌκ³ μκ°νλ©΄ λλ€. νμ
μ νΈνμ±μ λ°μ§λ μ΄μ λ μ»΄νμΌ λ¨κ³μμ νΈνλμ§ μλ κ²μ μ°ΎκΈ° μν¨μ΄λ€.
νΉμ λ³μλ₯Ό λ€λ₯Έ λ³μμ ν λΉνκΈ° μν΄μλ κ·Έ νμ
μ ν λΉμ΄ κ°λ₯ν΄μΌ νλ€. μ¦, ν λΉνλ €λ λμμ νμ
μ νΈνλμ΄μΌ νλ€λ λ»μ΄λ€. νΈν μ¬λΆλ νμ
μ λ²μκ° ν° κ²μ μμ κ²μ΄ νΈν λλ€κ³ μκ°νλ©΄ μ½λ€.
function boundary(a: number, b: number | string): void {
const v1: number | string = a;
const v2: number = b; // Error
}
μμ μ½λμμ v2μ κ²½μ°μλ number νμ
λ§ ν λΉ κ°λ₯νλ°, number | stringμ κ°μ΄ λ μ μλ bλ₯Ό ν λΉνλ €κ³ νκΈ° λλ¬Έμ, κ·Έ ν λΉμ λ²μ ν¬κΈ° λΉκ΅μμ νΈνμ΄ μ΄λ£¨μ΄ μ§ μ μμ΄ μλ¬κ° λ¬λ€. string | number > number
Structure Typing
νμ
μ€ν¬λ¦½νΈλ κ° μμ²΄λ‘ νμ
νΈνμ±μ λΉκ΅νμ§ μλλ€. κ°μ κ°μ§κ³ μλ νμ
μ λ΄λΆ ꡬ쑰μ κΈ°λ°νλ€. κ·Έλμ μλ‘ λ€λ₯Έ μ΄λ¦μΌλ‘ μ μλ νμ
λ€μ λ΄λΆ ꡬ쑰 μ¦, μμ±μ μ΄λ¦κ³Ό κ·Έ μμ±μ νμ
μ΄ κ°λ€λ©΄ νμ
νΈνμ΄ κ°λ₯νλ€κ³ νλ¨νλ κ²μ΄λ€.
interface Human {
name: string;
age: number;
}
interface Unicorn {
name: string;
age: number;
}
const woman: Human = { name: '', age: 20 };
const wnicorn: Unicorn = woman; // νμ
μ΄ νΈνλλ€!
Interface νμ μ νΈνμ±
νΉμ μΈν°νμ΄μ€(A)κ° λ€λ₯Έ μΈν°νμ΄μ€(B)λ‘ ν λΉλκΈ° μν 쑰건μ λ€μκ³Ό κ°λ€. μ½κ² μ΄ν΄νκΈ° μν΄μ λ±νΈλ‘ ν¬κΈ° λΉκ΅ λλμ κ°μ Έκ°κ² λ€.
- Aμ μ μλ μμ±μ μ΄λ¦μ λͺ¨λ Bμλ λμΌνκ² μμ΄μΌ νλ€.
Aμμ±μ΄λ¦ <= Bμμ±μ΄λ¦
- μ΄λ¦μ΄ κ°μ μμ±μ λν΄μ, Aμ μμ±μ΄ Bμ μμ±μ ν λΉ κ°λ₯ν΄μΌ νλ€.
A κ°λ³ μμ± νμ <= B κ°λ³ μμ± νμ
- Aκ° ν λΉλ μ μλ κ°μ λ²μκ° Bλ³΄λ€ λλ€. (μ΄ λΆλΆμ μ μ΄ν΄ν΄μΌ νλ€.)
interface Human {
name: string;
}
interface Shark {
name: string;
tooth: number;
}
const baby = { name: 'baby', tooth: '28', poop: true };
const babyHuman: Human = baby; // ok
const babyShark: Shark = baby; // Error νμ
νΈνμ΄ μλλ€.
babyHuman = babyShark; // λ¬Έμ μλ€. nameμ΄ λμΌνκΈ° λλ¬Έμ΄λ€. (κ°μ λ²μ!)
κ·Έλμ μΈν°νμ΄μ€ νμ μ νΈνμ λ§μΆλλ μ΅μ λ μμ±(?λ‘ μ μ)μ μ£Όμν΄μΌ νλ€. μ΅μ λν μμ±μ μμ μλ μκ³ , μμ μλ μλ μμ±μ΄λΌμ κ°μ λ²μλ₯Ό λμ¬μ£Όλ μν μ νκ²λλ€.
ν¨μμ νμ νΈνμ±
νΉμ ν ν¨μ(A)μ λ€λ₯Έ ν¨μ(B)λ₯Ό ν λΉνκΈ° μν΄μλ λ€μμ 쑰건μ λ§μ‘±ν΄μΌ νλ€. 쑰건μ λμ§ΈμΉκ³ κ°μ₯ μ€μν κ²μ ν¨μμ μ€νμμ μ κ·Έ ν¨μκ° μ΄λ€ νμ μ λκ³ μλμ§, κ·Έλ¦¬κ³ νμ μ λ²μκ° μ΄λ€μ§κ° μ€μνλ€.
- Aμ 맀κ°λ³μ κ°μκ° Bμ κ°μλ³΄λ€ λ§μμΌ νλ€. μ½κ² μκ°ν΄μ ν¨μλ₯Ό λμνκΈ° μν΄ νμν 맀κ°λ³μκ° λ§μ κ²μ μ μ κ²μ ν λΉ ν μ μλ€λ λ§μ΄λ€.
- κ°μ μμΉμ 맀κ°λ³μλ νμ νΈνμ±μ΄ λ§μμΌ νλ€.
- Bμ 리ν΄κ°μ λν νμ μ΄ Aμ 리ν΄κ° νμ λ³΄λ€ κ·Έ λ²μκ° μμμΌ νλ€.
// κ° ν¨μ νμ
μ μ
type F1 = (a: number, b: string) => string;
type F2 = (a: number, b: string | number) => string;
type F3 = (a: number) => string;
type F4 = (a: number) => string | number;
// ν¨μ
let f1: F1 = (a, b) => `${a}, ${b.length}`;
let f2: F2 = (a, b) => `${a}, ${b}`;
let f3: F3 = (a) => `${a}`;
let f4: F4 = (a) => (a < 10 ? a : 'not a');
// ν λΉ κ²μ¬
f1 = f3; // ok -> f1μ 맀κ°λ³μκ° λ λ§λ€. (κ°λΉν΄μΌ ν κ°μ λ²μκ° μλ€.)
f3 = f1; // Error -> 맀κ°λ³μ μ°¨μ΄κ° λλ€.
f1 = f2; // ok -> bλΌλ 맀κ°λ³μκ° f2μ bμ νΈνλλ€.
f2 = f1; // Error -> f2μ b 맀κ°λ³μμ λ²μκ° λ λμ΄μ νΈνμ΄ λμ§ μλλ€.
f4 = f3; // ok
f3 = f4; // Error -> f4λ‘ νΈμΆν λ λ°νλ μ μλ κ°μ νμ
μ΄ λ λλ€.