/
πŸ“˜

Interface

TypeScript
Table of contents

interface ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄ 값이 νŠΉμ •ν•œ ν˜•νƒœ(shape)λ₯Ό 갖도둝 μ œμ•½ν•  수 μžˆλ‹€. μΈν„°νŽ˜μ΄μŠ€μ— μ„ μ–Έλœ ν”„λ‘œνΌν‹° λ˜λŠ” λ©”μ†Œλ“œμ˜ κ΅¬ν˜„μ„ κ°•μ œν•˜μ—¬ 일관성을 μœ μ§€ν•  수 μžˆλ„λ‘ ν•˜λŠ” 것이닀. μ΄λŠ” μ—¬λŸ¬κ°€μ§€ νƒ€μž…μ„ κ°–λŠ” ν”„λ‘œνΌν‹°λ‘œ 이루어진 μƒˆλ‘œμš΄ νƒ€μž…μ„ μ •μ˜ν•˜λŠ” 것과 μœ μ‚¬ν•˜λ‹€.

덕 타이핑 (Duck Typing)

TypeScriptλŠ” 객체가 νŠΉμ • μΈν„°νŽ˜μ΄μŠ€μ—μ„œ μ •μ˜ν•œ(λͺ…μ‹œν•˜λŠ”) ν”„λ‘œνΌν‹°λ‚˜ λ©”μ†Œλ“œλ₯Ό 가지고 μžˆλ‹€λ©΄ ν•΄λ‹Ή 객체가 κ·Έ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ κ²ƒμœΌλ‘œ μΈμ •ν•œλ‹€. μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν™œμš©ν•˜λ©΄ 덕 타이핑을 ν•  λ•Œ λ©”μ†Œλ“œλ₯Ό κ²€μ‚¬ν•˜μ§€ μ•Šκ³ λ„ λŸ°νƒ€μž„ μ—λŸ¬λ₯Ό 막을 수 μžˆλ‹€.

덕 타이핑(duck typing) / ꡬ쑰적 타이핑(structural typing)

동적 νƒ€μ΄ν•‘μ˜ ν•œ μ’…λ₯˜λ‘œ, 객체의 λ³€μˆ˜ 및 λ©”μ†Œλ“œμ˜ 집합이 객체의 νƒ€μž…μ„ κ²°μ •ν•˜λŠ” 것을 λ§ν•œλ‹€. 클래슀 μƒμ†μ΄λ‚˜ μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„μœΌλ‘œ νƒ€μž…μ„ κ΅¬λΆ„ν•˜λŠ” λŒ€μ‹ , 덕 타이핑은 객체가 μ–΄λ–€ νƒ€μž…μ— κ±Έλ§žμ€ λ³€μˆ˜μ™€ λ©”μ†Œλ“œλ₯Ό μ§€λ‹ˆλ©΄ 객체λ₯Ό ν•΄λ‹Ή νƒ€μž…μ— μ†ν•˜λŠ” κ²ƒμœΌλ‘œ κ°„μ£Όν•œλ‹€.

덕 타이핑 - μœ„ν‚€λ°±κ³Ό

strictν•˜κ²Œ 타이핑을 ν•˜κ³  μ‹Άλ‹€λ©΄ implements ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ λͺ…μ‹œμ μœΌλ‘œ μ„ μ–Έν•΄μ£ΌλŠ” 것도 쒋은 방법이닀.

μΈν„°νŽ˜μ΄μŠ€μ™€ ν”„λ‘œνΌν‹° νƒ€μž… μ •μ˜

typescript
// μΈν„°νŽ˜μ΄μŠ€ μ •μ˜
interface InterfaceName {
key: string; // ν”„λ‘œνΌν‹° νƒ€μž… μ •μ˜
}

선택적 ν”„λ‘œνΌν‹° (Optional Properties)

ν”„λ‘œνΌν‹° 이름 끝에 ?λ₯Ό λΆ™μ—¬ Optional Properties둜 μ„ μ–Έ ν•  수 μžˆλ‹€.
μ„ νƒμ μœΌλ‘œ μ‚¬μš© κ°€λŠ₯ν•œ ν”„λ‘œνΌν‹°λ₯Ό μž‘μ„±ν•˜λ©΄μ„œ μΈν„°νŽ˜μ΄μŠ€μ— μ†ν•˜μ§€ μ•ŠλŠ” ν”„λ‘œνΌν‹°μ˜ μ‚¬μš©μ„ 방지 ν•  수 μžˆλ‹€.

typescript
interface User {
name: string;
age?: number; // optional property
}

선택적 μ‚¬μš© κ°€λŠ₯ν•œ ν”„λ‘œνΌν‹°λ₯Ό μ‰½κ²Œ νŒŒμ•…ν•  수 μžˆμ–΄ μ½”λ“œμ˜ 가독성이 쒋아진닀.

μ½κΈ°μ „μš© ν”„λ‘œνΌν‹° (Readonly Properties)

ν”„λ‘œνΌν‹° 이름 μ•žμ— readonly ν‚€μ›Œλ“œλ‘œ 객체가 처음 생성될 λ•Œλ§Œ μˆ˜μ • κ°€λŠ₯ν•˜κ²ŒλŠ” λ¦¬λ“œμ˜¨λ¦¬ ν”„λ‘œνΌν‹°λ‘œ μ„ μ–Έ ν•  수 μžˆλ‹€.
μƒμ„±ν•˜λ©΄μ„œ ν• λ‹Ή ν•œ 값은 μž¬ν• λ‹Ήμ΄ λΆˆκ°€λŠ₯ν•΄ 진닀. Type assertion으둜 μ˜€λ²„λΌμ΄λ“œν•˜λŠ” 것은 κ°€λŠ₯ν•˜λ‹€.

typescript
interface User {
readonly name: string;
age: number;
}

λ³€μˆ˜ μΈν„°νŽ˜μ΄μŠ€

μΈν„°νŽ˜μ΄μŠ€λ₯Ό νƒ€μž…μœΌλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ€€μˆ˜ν•˜μ—¬μ•Ό ν•œλ‹€.

typescript
// μΈν„°νŽ˜μ΄μŠ€μ˜ μ •μ˜
interface Todo {
id: number;
content: string;
completed: boolean;
}
// λ³€μˆ˜ todo의 νƒ€μž…μœΌλ‘œ Todo μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ„ μ–Έν•˜μ˜€λ‹€.
let todo: Todo;
// λ³€μˆ˜ todoλŠ” Todo μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ€€μˆ˜ν•˜μ—¬μ•Ό ν•œλ‹€.
todo = { id: 1, content: 'typescript', completed: false };

색인가λŠ₯ νƒ€μž… (Indexable Types)

Indexable type은 인덱슀 μ‹œκ·Έλ‹ˆμ²˜(index signature)λ₯Ό μ‚¬μš©ν•΄ λ™μ μ΄λ©΄μ„œ 색인 κ°€λŠ₯ν•œ(indexable) 객체의 νƒ€μž…μ„ μ •μ˜ν•  수 있고, λ¬Έμžμ—΄ λ˜λŠ” 숫자만 μ‚¬μš© κ°€λŠ₯ν•˜λ‹€. readonly ν‚€μ›Œλ“œλ‘œ 색인 μ—­μ‹œ 읽기 μ „μš©μœΌλ‘œ μ„ μ–Έν•  수 μžˆλ‹€.

인덱슀 μ‹œκ·Έλ‹ˆμ²˜ (Index signature)

μΈλ±μ„œλΈ” νƒ€μž…μ„ μ •μ˜ν•˜κΈ° μœ„ν•΄ 색인에 μ ‘κ·Όν•  λ•Œ μ‚¬μš©ν•˜λŠ” 기호인 λŒ€κ΄„ν˜Έ []λ₯Ό μ΄μš©ν•΄ Indexableν•˜κ²Œ λ§Œλ“€μ–΄ μ€€λ‹€.
[INDEXER_NAME: INDEXER_TYPE]: RETURN_TYPE

typescript
interface Indexable {
[key: string]: any; // index signature
}

κ΄„ν˜Έ ν‘œκΈ°λ²•μœΌλ‘œ 동적인 ν‚€ 값을 μ‚¬μš©ν•˜μ—¬ μ ‘κ·Όν•˜λ €λŠ” 경우

TypeScriptμ—μ„œ κ΄„ν˜Έ ν‘œκΈ°λ²•μœΌλ‘œ 동적인 ν‚€ 값을 μ‚¬μš©ν•˜μ—¬ μ ‘κ·Όν•˜λ €λŠ” 경우, μ–΄λ–€ νƒ€μž…μ˜ ν”„λ‘œνΌν‹°μ— μ ‘κ·Όν•˜λŠ” 지 μ•Œ 수 μ—†κΈ° λ•Œλ¬Έμ— 리턴 값을 μ•”λ¬΅μ μœΌλ‘œ any νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•˜λ©΄μ„œ μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚¨λ‹€. μ΄λ ‡κ²Œ μ½”λ“œμ˜ μ‹€ν–‰ μ‹œμ μ—μ„œλ§Œ μ•Œ 수 μžˆλŠ” μ΄λ¦„μ˜ 동적 속성을 κ°–λŠ” νƒ€μž…μ„ ν‘œμ‹œν• λ•Œ μ‚¬μš© ν•  수 μžˆλ‹€.

μƒ‰μΈμ˜ νƒ€μž…μœΌλ‘œ λ¬Έμžμ—΄ 색인과 숫자 색인이 λͺ¨λ‘ μ‘΄μž¬ν•˜λŠ” 경우

μƒ‰μΈμ˜ νƒ€μž…μœΌλ‘œ λ¬Έμžμ—΄ 색인과 숫자 색인이 λͺ¨λ‘ μ‘΄μž¬ν•˜λŠ” 경우 숫자둜 색인 된 κ°’μ˜ νƒ€μž…μ€ λ¬Έμžμ—΄λ‘œ 색인 된 κ°’ νƒ€μž…μ˜ μ„œλΈŒνƒ€μž…μ΄μ–΄μ•Ό ν•œλ‹€.

typescript
// BλŠ” A의 μ„œλΈŒνƒ€μž…μ΄μ–΄μ•Ό ν•œλ‹€.
interface Mixed <A, B> {
[stringIndex: string]: A;
[numberIndex: number]: B;
}

μ΄λŸ¬ν•œ μ œμ•½μ΄ μ‘΄μž¬ν•˜λŠ” μ΄μœ λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ μƒ‰μΈμ˜ λ™μž‘ 방식 λ•Œλ¬Έμ΄λ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œμ—μ„œ 객체의 색인에 μ ‘κ·Όν•  λ•Œ, λ‚΄λΆ€μ μœΌλ‘œλŠ” μƒ‰μΈμ˜ toString() λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•΄ λ¬Έμžμ—΄λ‘œ λ³€ν˜•λœ 값을 μƒ‰μΈμœΌλ‘œ μ‚¬μš©ν•œλ‹€.

μΈλ±μ„œλΈ” νƒ€μž…μ˜ μ‚¬μš© 예

λ§Œμ•½ 색인 κ°€λŠ₯ νƒ€μž…μ΄ 없이 T νƒ€μž…μ˜ μ›μ†Œλ₯Ό κ°–λŠ” Array μΈν„°νŽ˜μ΄μŠ€λ₯Ό μž‘μ„±ν•œλ‹€λ©΄ λŒ€λž΅ μ•„λž˜μ™€ 같은 μ‹μœΌλ‘œ λͺ¨λ“  색인에 λŒ€ν•œ νƒ€μž…μ„ 일일이 μ •μ˜ν•΄μ•Ό ν•  것이닀.

typescript
interface Array<T> {
length: number;
0?: T;
1?: T;
/* ... */
Number.MAX_SAFE_INTEGER?: T;
/* λ©”μ†Œλ“œ μ •μ˜ */
}

인덱슀 νƒ€μž…μ„ μ΄μš©ν•˜λ©΄ μœ„ μ½”λ“œλ₯Ό λ‹€μŒμ²˜λŸΌ κ°„κ²°ν•˜κ²Œ λŒ€μ²΄ν•  수 μžˆλ‹€.

typescript
interface Array<T> {
length: number;
[index: number]?: T;
/* λ©”μ†Œλ“œ μ •μ˜ */
}

ν•¨μˆ˜ νŒŒλΌλ―Έν„°μ˜ μΈν„°νŽ˜μ΄μŠ€

μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜μ—¬ ν•¨μˆ˜ νŒŒλΌλ―Έν„°μ˜ νƒ€μž…μ„ μ„ μ–Έ ν•  수 μžˆλ‹€. ν•΄λ‹Ή ν•¨μˆ˜μ—λŠ” ν•¨μˆ˜ νŒŒλΌλ―Έν„°μ˜ νƒ€μž…μœΌλ‘œ μ§€μ •ν•œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ€€μˆ˜ν•˜λŠ” 인수λ₯Ό μ „λ‹¬ν•˜μ—¬μ•Ό ν•œλ‹€. μ΄λŠ” ν•¨μˆ˜μ— 객체λ₯Ό 전달할 λ•Œ λ³΅μž‘ν•œ λ§€κ°œλ³€μˆ˜ 체크가 ν•„μš”μ—†μ–΄μ„œ 맀우 μœ μš©ν•˜λ‹€.

typescript
// μΈν„°νŽ˜μ΄μŠ€μ˜ μ •μ˜
interface Todo {
id: number;
content: string;
completed: boolean;
}
let todos: Todo[] = [];
// νŒŒλΌλ―Έν„° todo의 νƒ€μž…μœΌλ‘œ Todo μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ„ μ–Έν•˜μ˜€λ‹€.
function addTodo(todo: Todo) {
todos = [...todos, todo];
}
// νŒŒλΌλ―Έν„° todoλŠ” Todo μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ€€μˆ˜ν•˜μ—¬μ•Ό ν•œλ‹€.
const newTodo: Todo = { id: 1, content: 'typescript', completed: false };
addTodo(newTodo);
console.log(todos)
// [ { id: 1, content: 'typescript', completed: false } ]

ν•¨μˆ˜ νƒ€μž… (Function Types)

μΈν„°νŽ˜μ΄μŠ€λŠ” ν•¨μˆ˜μ˜ νƒ€μž…μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€. ν•¨μˆ˜ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” ν•¨μˆ˜ λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ€€μˆ˜ν•˜μ—¬μ•Ό ν•œλ‹€.
호좜 μ‹œκ·Έλ‹ˆμ²˜(call signature)둜 ν•¨μˆ˜μ˜ μΈν„°νŽ˜μ΄μŠ€μ— νƒ€μž…μ΄ μ„ μ–Έλœ νŒŒλΌλ―Έν„° λ¦¬μŠ€νŠΈμ™€ 리턴 νƒ€μž…μ„ μ •μ˜ν•œλ‹€.

호좜 μ‹œκ·Έλ‹ˆμ²˜(Call signature)

μ‹λ³„μž 없이, λ°›μ•„μ•Όν•  인자의 νƒ€μž…κ³Ό, 리턴 νƒ€μž…λ§Œμ„ ν‘œκΈ°ν•˜λ©΄ λœλ‹€.

(PARAMETER1: PARAM1_TYPE, PARAMETER2: PARAM2_TYPE, ...): RETURN_TYPE

typescript
interface Callable {
(key: string): any // call signature
}
typescript
// ν•¨μˆ˜ μΈν„°νŽ˜μ΄μŠ€μ˜ μ •μ˜
interface SquareFunc {
(num: number): number; // call signature
}
// ν•¨μˆ˜ μΈν…ŒνŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” ν•¨μˆ˜λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ€€μˆ˜ν•˜μ—¬μ•Ό ν•œλ‹€.
const squareFunc: SquareFunc = function (num: number) {
return num * num;
};
console.log(squareFunc(10)); // 100

ν•¨μˆ˜ μ •μ˜μ™€ μΈν„°νŽ˜μ΄μŠ€μ—μ„œμ˜ λ§€κ°œλ³€μˆ˜ 이름은 κΌ­ 같을 ν•„μš”λŠ” μ—†κ³  λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž… μˆœμ„œλ§Œ λ§žλŠ”λ‹€λ©΄ μ—λŸ¬λŠ” λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.

ν•˜μ΄λΈŒλ¦¬λ“œ νƒ€μž… (Hybrid Types)

콜 μ‹œκ·Έλ‹ˆμ²˜μ™€ ν”„λ‘œνΌν‹° νƒ€μž… μ •μ˜λ₯Ό λ™μ‹œμ— κ°–λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν•˜μ΄λΈŒλ¦¬λ“œ νƒ€μž…(hybrid type)이라 λΆ€λ₯Έλ‹€.

호좜 κ°€λŠ₯(callable) ν•˜λ©΄μ„œ λ™μ‹œμ— μΆ”κ°€μ μœΌλ‘œ μ—¬λŸ¬ 속성을 κ°–λŠ” 객체가 μ‘΄μž¬ν•  수 있고, 이런 객체의 νƒ€μž…μ„ ν‘œν˜„ν•˜κΈ° μœ„ν•΄ 콜 μ‹œκ·Έλ‹ˆμ³μ™€ ν”„λ‘œνΌν‹° νƒ€μž… μ •μ˜λ₯Ό λ™μ‹œμ— μ‚¬μš© ν•  수 μžˆλ‹€.

typescript
interface Counter {
(start: number): string;
interval: number;
reset(): void;
}
function getCounter(): Counter {
let counter = <Counter>function (start: number) { };
counter.interval = 123;
counter.reset = function () { };
return counter;
}
let c = getCounter();
c(10);
c.reset();
c.interval = 5.0;

μœ„μ˜ Counter νƒ€μž…μ˜ 값은 ν•¨μˆ˜λ‘œμ„œ 호좜 ν•  수 있고, λ”°λΌμ„œ 호좜 μ‹œκ·Έλ‹ˆμ³λ₯Ό κ°–λŠ”λ‹€. 이 μΈν„°νŽ˜μ΄μŠ€λŠ” μΆ”κ°€μ μœΌλ‘œ intervalκ³Ό reset μ΄λΌλŠ” 속성을 가진닀. λ”°λΌμ„œ μΈν„°νŽ˜μ΄μŠ€λŠ” ν•΄λ‹Ή μ†μ„±μ˜ νƒ€μž… 정보 λ˜ν•œ ν¬ν•¨ν•œλ‹€.

클래슀 νƒ€μž… (Class Types)

클래슀 μ„ μ–Έλ¬Έμ˜ implements 뒀에 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λ©΄ ν•΄λ‹Ή ν΄λž˜μŠ€λŠ” μ§€μ •λœ μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ°˜λ“œμ‹œ κ΅¬ν˜„ν•˜μ—¬μ•Ό ν•œλ‹€.
μΈν„°νŽ˜μ΄μŠ€λŠ” ν”„λ‘œνΌν‹°μ™€ λ©”μ†Œλ“œλ₯Ό κ°€μ§ˆ 수 μžˆλ‹€λŠ” μ μ—μ„œ ν΄λž˜μŠ€μ™€ μœ μ‚¬ν•˜λ‚˜ 직접 μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 μˆ˜λŠ” μ—†λ‹€.

typescript
// μΈν„°νŽ˜μ΄μŠ€μ˜ μ •μ˜
interface ITodo {
id: number;
content: string;
completed: boolean;
}
// Todo ν΄λž˜μŠ€λŠ” ITodo μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜μ—¬μ•Ό ν•œλ‹€.
class Todo implements ITodo {
constructor (
public id: number,
public content: string,
public completed: boolean
) { }
}
const todo = new Todo(1, 'Typescript', false);
console.log(todo);

μΈν„°νŽ˜μ΄μŠ€μ˜ 좔상 λ©”μ†Œλ“œ

μΈν„°νŽ˜μ΄μŠ€λŠ” ν”„λ‘œνΌν‹°λΏλ§Œ μ•„λ‹ˆλΌ λ©”μ†Œλ“œλ„ 포함할 수 μžˆλ‹€. 단, λͺ¨λ“  λ©”μ†Œλ“œλŠ” 좔상 λ©”μ†Œλ“œμ΄μ–΄μ•Ό ν•œλ‹€.
μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” ν΄λž˜μŠ€λŠ” μΈν„°νŽ˜μ΄μŠ€μ—μ„œ μ •μ˜ν•œ ν”„λ‘œνΌν‹°μ™€ 좔상 λ©”μ†Œλ“œλ₯Ό λ°˜λ“œμ‹œ κ΅¬ν˜„ν•˜μ—¬μ•Ό ν•œλ‹€.

typescript
// μΈν„°νŽ˜μ΄μŠ€μ˜ μ •μ˜
interface IPerson {
name: string;
sayHello(): void;
}
/*
μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” ν΄λž˜μŠ€λŠ” μΈν„°νŽ˜μ΄μŠ€μ—μ„œ μ •μ˜ν•œ ν”„λ‘œνΌν‹°μ™€ 좔상 λ©”μ†Œλ“œλ₯Ό λ°˜λ“œμ‹œ κ΅¬ν˜„ν•˜μ—¬μ•Ό ν•œλ‹€.
*/
class Person implements IPerson {
// μΈν„°νŽ˜μ΄μŠ€μ—μ„œ μ •μ˜ν•œ ν”„λ‘œνΌν‹°μ˜ κ΅¬ν˜„
constructor(public name: string) {}
// μΈν„°νŽ˜μ΄μŠ€μ—μ„œ μ •μ˜ν•œ 좔상 λ©”μ†Œλ“œμ˜ κ΅¬ν˜„
sayHello() {
console.log(`Hello ${this.name}`);
}
}
function greeter(person: IPerson): void {
person.sayHello();
}
const me = new Person('Lee');
greeter(me); // Hello Lee

클래슀 νƒ€μž…μ€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” 클래슀의 일관성을 μœ μ§€ν•  수 μžˆλŠ” μž₯점을 κ°–λŠ”λ‹€.

μΈν„°νŽ˜μ΄μŠ€ ν™•μž₯

μΈν„°νŽ˜μ΄μŠ€λŠ” extends ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μΈν„°νŽ˜μ΄μŠ€ λ˜λŠ” 클래슀λ₯Ό ν™•μž₯ν• (상속 받을) 수 μžˆλ‹€.

typescript
interface Person {
name: string;
age?: number;
}
interface Student extends Person {
grade: number;
}
const student: Student = {
name: 'Lee',
age: 20,
grade: 3
};

λ‹€μˆ˜μ˜ μΈν„°νŽ˜μ΄μŠ€ λ™μ‹œ ν™•μž₯

μΈν„°νŽ˜μ΄μŠ€λŠ” λ™μ‹œμ— ν•˜λ‚˜ μ΄μƒμ˜ μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν™•μž₯(상속)ν•  수 μžˆλ‹€. ν™•μž₯ λŒ€μƒμ΄ λ˜λŠ” μΈν„°νŽ˜μ΄μŠ€λ“€μ€ ,으둜 κ΅¬λΆ„ν•œλ‹€.

typescript
interface Person {
name: string;
age?: number;
}
interface Developer {
skills: string[];
}
// λͺ¨λ“  ν™•μž₯ λŒ€μƒ μΈν„°νŽ˜μ΄μŠ€μ˜ 속성에 μžμ‹ μ˜ 속성을 λ”ν•œ νƒ€μž…μ„ κ°–λŠ”λ‹€.
interface WebDeveloper extends Person, Developer {}
const webDeveloper: WebDeveloper = {
name: 'Lee',
age: 20,
skills: ['HTML', 'CSS', 'JavaScript']
};

ν™•μž₯ λŒ€μƒμΈ μΈν„°νŽ˜μ΄μŠ€ 쀑 μ—¬λŸ¬ μΈν„°νŽ˜μ΄μŠ€κ°€ 같은 μ΄λ¦„μ˜ 속성을 κ°€μ§ˆ 수 μžˆμ§€λ§Œ 이름이 κ²ΉμΉ˜λŠ” μ†μ„±μ˜ νƒ€μž…μ€ λͺ¨λ“  ν™•μž₯ λŒ€μƒ μΈν„°νŽ˜μ΄μŠ€μ—μ„œ κ°™μ•„μ•Ό ν•œλ‹€. 같은 μ΄λ¦„μ˜ 속성이 λ‹€λ₯Έ νƒ€μž…μ„ κ°–λŠ” 경우 νƒ€μž… μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.

클래슀λ₯Ό ν™•μž₯ν•œ μΈν„°νŽ˜μ΄μŠ€

μΈν„°νŽ˜μ΄μŠ€λŠ” μΈν„°νŽ˜μ΄μŠ€ 뿐만 μ•„λ‹ˆλΌ ν΄λž˜μŠ€λ„ ν™•μž₯(상속)ν•  수 μžˆλ‹€.
클래슀의 λͺ¨λ“  멀버(public, protected, private)κ°€ μƒμ†λ˜μ§€λ§Œ κ΅¬ν˜„κΉŒμ§€ μƒμ†ν•˜μ§€ μ•ŠλŠ”λ‹€.

typescript
class Person {
constructor(public name: string, public age: number) {}
}
// μΈν„°νŽ˜μ΄μŠ€μ˜ 클래슀 상속
interface Developer extends Person {
skills: string[];
}
const developer: Developer = {
name: 'Lee',
age: 20,
skills: ['HTML', 'CSS', 'JavaScript']
};

μš”μ•½

  • μΈν„°νŽ˜μ΄μŠ€μ— μ„ μ–Έλœ ν”„λ‘œνΌν‹° λ˜λŠ” λ©”μ†Œλ“œμ˜ κ΅¬ν˜„μ„ κ°•μ œν•˜μ—¬ 일관성을 μœ μ§€ν•  수 μžˆλ‹€.
  • μΈν„°νŽ˜μ΄μŠ€λ₯Ό νƒ€μž…μœΌλ‘œ μ‚¬μš©ν•˜λ©΄ ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€κ°€ 가진 ν”„λ‘œνΌν‹°λ₯Ό λ°˜λ“œμ‹œ κ΅¬ν˜„ν•΄μ•Όν•œλ‹€.
  • ?λ₯Ό ν”„λ‘œνΌν‹° 이름 끝에 λΆ™μ—¬ κ°•μ œν™” ν•˜μ§€ μ•ŠλŠ” μ˜΅μ…”λ„ ν”„λ‘œνΌν‹°λ„ ν‘œν˜„ κ°€λŠ₯ν•˜λ‹€.
  • readonly ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄μ„œ μž¬ν• λ‹Ήμ΄ λΆˆκ°€λŠ₯ν•œ μ½κΈ°μ „μš© ν”„λ‘œνΌν‹° ν‘œν˜„ ν•  수 μžˆλ‹€. (const 'λΉ„μŠ·' ν•˜λ‹€)
  • μΈλ±μ„œλΈ” νƒ€μž…μ€ 인덱슀 μ‹œκ·Έλ‹ˆμ²˜λ₯Ό μ‚¬μš©ν•΄ 동적이고 색인 κ°€λŠ₯ν•œ 객체 νƒ€μž…μ„ μ •μ˜ν•œ 것 이닀.
  • ν•¨μˆ˜ νƒ€μž…μ€ 호좜 μ‹œκ·Έλ‹ˆμ²˜λ₯Ό μ‚¬μš©ν•΄ νƒ€μž…μ΄ μ„ μ–Έλœ νŒŒλΌλ―Έν„° λ¦¬μŠ€νŠΈμ™€ 리턴 νƒ€μž…μ„ μ •μ˜ν•œ 것 이닀.
  • 호좜 μ‹œκ·Έλ‹ˆμ²˜μ™€ ν”„λ‘œνΌν‹° νƒ€μž… μ •μ˜λ₯Ό λ™μ‹œμ— κ°–λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν•˜μ΄λΈŒλ¦¬λ“œ νƒ€μž…(hybrid type)라 ν•œλ‹€.
  • implements 뒀에 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λ©΄ ν•΄λ‹Ή ν΄λž˜μŠ€λŠ” μ§€μ •λœ μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ°˜λ“œμ‹œ κ΅¬ν˜„ν•˜μ—¬μ•Ό ν•œλ‹€.
  • μΈν„°νŽ˜μ΄μŠ€λŠ” λ©”μ†Œλ“œλ„ 포함 ν•  수 μžˆμ§€λ§Œ, 좔상 λ©”μ†Œλ“œμ΄μ–΄μ•Ό ν•œλ‹€.
  • μΈν„°νŽ˜μ΄μŠ€λŠ” ν”„λ‘œνΌν‹°μ™€ λ©”μ†Œλ“œλ₯Ό κ°€μ§ˆ 수 μžˆλ‹€λŠ” μ μ—μ„œ ν΄λž˜μŠ€μ™€ μœ μ‚¬ν•˜λ‚˜ 직접 μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 μˆ˜λŠ” μ—†λ‹€.
  • μΈν„°νŽ˜μ΄μŠ€λŠ” extends ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μΈν„°νŽ˜μ΄μŠ€ λ˜λŠ” 클래슀λ₯Ό 상속 받을 수 있고, λ‹€μˆ˜μ˜ μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ™μ‹œμ— 상속 받을 μˆ˜λ„ μžˆλ‹€.

ν•œ 쀄 μš”μ•½

μΈν„°νŽ˜μ΄μŠ€λŠ” 일반적으둜 νƒ€μž… 체크λ₯Ό μœ„ν•΄ μ‚¬μš©λ˜λ©° λ³€μˆ˜, ν•¨μˆ˜, ν΄λž˜μŠ€μ— μ‚¬μš©ν•  수 있고, μ—¬λŸ¬κ°€μ§€ νƒ€μž…μ„ κ°–λŠ” ν”„λ‘œνΌν‹°λ‘œ 이루어진 μƒˆλ‘œμš΄ νƒ€μž…μ„ μ •μ˜ν•˜λŠ” 것과 μœ μ‚¬ν•˜λ‹€.

reference

νƒ€μž…μŠ€ν¬λ¦½νŠΈ: ν•Έλ“œλΆ - μΈν„°νŽ˜μ΄μŠ€ / TypeScript: Handbook - Interfaces
(λ‹€λ“¬κΈ°λŠ” ν–ˆμ§€λ§Œ λ²ˆμ—­κΈ°λ₯Ό μ‚¬μš©ν•œ λ“―ν•œ λ¬Έμž₯이 λ§ŽμœΌλ‹ˆ 원본과 같이 μ½λŠ”κ²Œ μ’‹λ‹€)

TypeScript - Interface | PoiemaWeb

4.1 μΈν„°νŽ˜μ΄μŠ€ 기초 - ts-for-jsdev

TypeScript: μΈν„°νŽ˜μ΄μŠ€(Interface) | DailyEngineering

ν•œλˆˆμ— λ³΄λŠ” νƒ€μž…μŠ€ν¬λ¦½νŠΈ(updated) | HEROPY

logo
Things I've Learned