Interface

interface ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄ 값이 νŠΉμ •ν•œ ν˜•νƒœ(shape)λ₯Ό 갖도둝 μ œμ•½ν•  수 μžˆλ‹€.
μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ •μ˜ν•˜λŠ” 기본적인 문법은 객체 νƒ€μž…μ˜ 그것과 μœ μ‚¬ν•˜λ‹€.
interface User { name: string; height: number; }
λ˜ν•œ 객체 νƒ€μž…μ—μ„œμ™€ λΉ„μŠ·ν•˜κ²Œ μΈν„°νŽ˜μ΄μŠ€μ˜ 속성을 읽기 μ „μš© 속성 λ˜λŠ” 선택 μ†μ„±μœΌλ‘œ μ •μ˜ν•  수 μžˆλ‹€
interface User { name: string; readonly height: number; favoriteLanguage?: string; } const author: User = { name: 'μ•ˆν¬μ’…', height: 176 }; // ok author.height = 183; // error TS2540: Cannot assign to 'height' because it is a constant or a read-only property.

ν•¨μˆ˜ μΈν„°νŽ˜μ΄μŠ€

μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ΄μš©ν•΄ ν•¨μˆ˜ νƒ€μž…μ„ ν‘œν˜„ν•  수 μžˆλ‹€.
ν•¨μˆ˜ νƒ€μž…μ˜ ν‘œν˜„μ„ μœ„ν•΄μ„  호좜 μ‹œκ·Έλ‹ˆμ³(call signature)λ₯Ό μ œκ³΅ν•΄μ•Ό ν•˜λŠ”λ°, ν•¨μˆ˜ νƒ€μž… μ •μ˜μ™€ μœ μ‚¬ν•œ μ•„λž˜ 문법을 μ‚¬μš©ν•œλ‹€.
(λ§€κ°œλ³€μˆ˜1 이름: λ§€κ°œλ³€μˆ˜1 νƒ€μž…, λ§€κ°œλ³€μˆ˜2 이름: λ§€κ°œλ³€μˆ˜2 νƒ€μž…, ...): λ°˜ν™˜ νƒ€μž…
예λ₯Ό λ“€μ–΄, User νƒ€μž…μ˜ κ°’ userλ₯Ό λ°›μ•„ 이름을 λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜ μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ‹€μŒκ³Ό 같이 적을 수 μžˆλ‹€.
interface User { name: string; height: number; } interface GetUserName { (user: User): string; } const getUserName: GetUserName = function (user) { return user.name; };
이 λ•Œ μ‹€μ œ ν•¨μˆ˜ μ •μ˜μ™€ μΈν„°νŽ˜μ΄μŠ€μ—μ„œμ˜ λ§€κ°œλ³€μˆ˜ 이름은 κΌ­ 같을 ν•„μš”λŠ” μ—†λ‹€.
즉 μœ„ μ½”λ“œμ—μ„œ μ•„λž˜μ²˜λŸΌ λ§€κ°œλ³€μˆ˜λͺ…을 userκ°€ μ•„λ‹Œ u둜 λ°”κΎΈμ–΄ 써도 λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž… μˆœμ„œλ§Œ λ§žλŠ”λ‹€λ©΄ μ—λŸ¬λŠ” λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.
interface User { name: string; height: number; } interface GetUserName { (user: User): string; } const getUserName: GetUserName = function (u) { return u.name; };

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

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” jQuery의 $κ³Ό 같이 호좜 κ°€λŠ₯ν•œ(callable) λ™μ‹œμ— μΆ”κ°€μ μœΌλ‘œ μ—¬λŸ¬ 속성을 κ°–λŠ” 객체가 μ‘΄μž¬ν•  수 μžˆλ‹€.
이런 객체의 νƒ€μž…μ„ ν‘œν˜„ν•˜κΈ° μœ„ν•΄μ„œ 호좜 μ‹œκ·Έλ‹ˆμ³μ™€ 속성 νƒ€μž… μ •μ˜λ₯Ό λ™μ‹œμ— 적을 수 μžˆλ‹€.
νƒ€μž…μŠ€ν¬λ¦½νŠΈ 곡식 λ¬Έμ„œμ˜ Counter 예제λ₯Ό μ‚΄νŽ΄λ³΄μž.
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 μ΄λΌλŠ” 속성을 κ°€μ§„λ‹€.
λ”°λΌμ„œ μΈν„°νŽ˜μ΄μŠ€λŠ” ν•΄λ‹Ή μ†μ„±μ˜ νƒ€μž… 정보 λ˜ν•œ ν¬ν•¨ν•œλ‹€.
μ΄λ ‡κ²Œ 호좜 μ‹œκ·Έλ‹ˆμ³μ™€ 속성 νƒ€μž…μ„ λ™μ‹œμ— κ°–λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν•˜μ΄λΈŒλ¦¬λ“œ νƒ€μž…(hybrid type)이라 λΆ€λ₯Έλ‹€.

μ œλ„ˆλ¦­ μΈν„°νŽ˜μ΄μŠ€

μΈν„°νŽ˜μ΄μŠ€ 이름 뒀에 νƒ€μž… λ³€μˆ˜ μ •μ˜λ₯Ό λΆ™μ—¬ μ œλ„ˆλ¦­ μΈν„°νŽ˜μ΄μŠ€(generic interface)λ₯Ό μ •μ˜ν•  수 μžˆλ‹€.
예λ₯Ό λ“€μ–΄, μ„œλ²„λ‘œλΆ€ν„° 받은 μž„μ˜μ˜ 응닡을 λ‚˜νƒ€λ‚΄λŠ” Response μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ•„λž˜μ™€ 같이 μ •μ˜ν•  수 μžˆλ‹€.
interface MyResponse<Data> { data: Data; status: number; ok: boolean; /* ... */ } inteface User { name: string; readonly height: number; /* ... */ } const user: MyReponse<User> = await getUserApiCall(userId); user.name; // νƒ€μž… μ‹œμŠ€ν…œμ€ user.name이 stringμž„μ„ μ•Œ 수 μžˆλ‹€.
ν•¨μˆ˜ μΈν„°νŽ˜μ΄μŠ€μ˜ μ •μ˜μ—λ„ μ œλ„ˆλ¦­μ„ μ‚¬μš© ν•  수 μžˆλ‹€. 이 경우 νƒ€μž… λ³€μˆ˜λŠ” λ§€κ°œλ³€μˆ˜μ˜ μ•žμ— μ λŠ”λ‹€.
interface GetData { <Data>(response: MyResponse<Data>): Data; }

νƒ€μž… λ³„μΉ­κ³Όμ˜ 차이

νƒ€μž…μ— μƒˆλ‘œμš΄ 이름을 λΆ™μ΄λŠ” μˆ˜λ‹¨μ΄λΌλŠ” μ μ—μ„œ μΈν„°νŽ˜μ΄μŠ€μ™€ μ•žμ„œ μ‚΄νŽ΄λ³Έ νƒ€μž… 별칭은 λΉ„μŠ·ν•œ 점이 λ§Žλ‹€.
ν•˜μ§€λ§Œ 두 κ°œλ… 사이엔 λ‹€μŒκ³Ό 같은 차이점이 μžˆλ‹€.
  • νƒ€μž… 별칭을 μ΄μš©ν•΄μ„œ κΈ°λ³Έ νƒ€μž…, λ°°μ—΄κ³Ό νŠœν”Œ, μœ λ‹ˆμ˜¨ νƒ€μž… 등에 μƒˆλ‘œμš΄ 이름을 뢙일 수 μžˆλ‹€ (type UUID = string). μΈν„°νŽ˜μ΄μŠ€λ‘œλŠ” ν•΄λ‹Ή νƒ€μž…μ„ ν‘œν˜„ν•˜λŠ” 것이 λΆˆκ°€λŠ₯ν•˜λ‹€.
  • νƒ€μž… 별칭은 μ‹€μ œλ‘œλŠ” μƒˆ νƒ€μž…μ„ μƒμ„±ν•˜μ§€ μ•ŠλŠ”λ‹€. λ”°λΌμ„œ type User = { name: string; } νƒ€μž…κ³Ό κ΄€λ ¨λœ νƒ€μž… μ—λŸ¬κ°€ λ°œμƒν–ˆμ„ μ‹œ μ—λŸ¬ λ©”μ‹œμ§€λŠ” User λŒ€μ‹  { name: string; } λ₯Ό 보여쀀닀. ν•œνŽΈ μΈν„°νŽ˜μ΄μŠ€λŠ” μ‹€μ œλ‘œ μƒˆ νƒ€μž…μ„ μƒμ„±ν•˜κ³ , interface User { name: string; } κ³Ό κ΄€λ ¨λœ μ—λŸ¬ λ©”μ‹œμ§€μ—λŠ” User κ°€ λ“±μž₯ν•œλ‹€.
  • μΈν„°νŽ˜μ΄μŠ€λŠ” κ³§ λ‹€λ£° extends ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•΄ ν™•μž₯ν•  수 μžˆλŠ” 반면, νƒ€μž… λ³„μΉ­μ˜ κ²½μš°λŠ” 그런 μˆ˜λ‹¨μ„ μ œκ³΅ν•˜μ§€ μ•ŠλŠ”λ‹€.
Β 
이런 차이점 λ•Œλ¬Έμ— νƒ€μž…μŠ€ν¬λ¦½νŠΈ 곡식 λ¬Έμ„œλŠ” κ°€λŠ₯ν•œ 경우 항상 νƒ€μž… 별칭보닀 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•  것을 ꢌμž₯ν•œλ‹€.
기본적으둜 μΈν„°νŽ˜μ΄μŠ€λ‘œ ν‘œν˜„ν•  수 μžˆλŠ” λͺ¨λ“  νƒ€μž…μ€ μΈν„°νŽ˜μ΄μŠ€λ‘œ ν‘œν˜„ν•˜κ³ , κΈ°λ³Έ νƒ€μž…μ— μƒˆλ‘œμš΄ 이름을 뢙이고 μ‹Άκ±°λ‚˜ μœ λ‹ˆμ˜¨ νƒ€μž…μ„ λͺ…λͺ…ν•˜κ³  싢은 경우 λ“± μΈν„°νŽ˜μ΄μŠ€μ˜ λŠ₯λ ₯ 밖인 λΆ€λΆ„μ—μ„œλ§Œ νƒ€μž… 별칭을 μ‚¬μš©ν•˜λΌ.
Β