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
ν€μλλ₯Ό μ΄μ©ν΄ νμ₯ν μ μλ λ°λ©΄, νμ λ³μΉμ κ²½μ°λ κ·Έλ° μλ¨μ μ 곡νμ§ μλλ€.
Β
μ΄λ° μ°¨μ΄μ λλ¬Έμ νμ
μ€ν¬λ¦½νΈ 곡μ λ¬Έμλ κ°λ₯ν κ²½μ° νμ νμ
λ³μΉλ³΄λ€ μΈν°νμ΄μ€λ₯Ό μ¬μ©ν κ²μ κΆμ₯νλ€.
κΈ°λ³Έμ μΌλ‘ μΈν°νμ΄μ€λ‘ ννν μ μλ λͺ¨λ νμ
μ μΈν°νμ΄μ€λ‘ νννκ³ , κΈ°λ³Έ νμ
μ μλ‘μ΄ μ΄λ¦μ λΆμ΄κ³ μΆκ±°λ μ λμ¨ νμ
μ λͺ
λͺ
νκ³ μΆμ κ²½μ° λ± μΈν°νμ΄μ€μ λ₯λ ₯ λ°μΈ λΆλΆμμλ§ νμ
λ³μΉμ μ¬μ©νλΌ.
Β