인터페이스는 상호 간에 정의한 약속 혹은 규칙을 의미합니다.
타입스크립트에서 반복되는 타입들을 모아서 하나의 인터페이스로 정의를 하여 사용 합니다.
// 인터페이스 선언
interface User {
age: number;
name: string;
}
let hyunho: User = {
age: 26,
name: '현호'
}
interface User {
age: number;
name: string;
}
function getUser(user: User){
console.log(user);
}
const capt = {
name: 'captin',
//age: 100
}
getUser(capt); // 오류 발생, capt 은 속성에 name 만 가지고 있고, age는 없기 때문에
interface sumFuntion{
(a: number, b: number): number;
}
let sum: sumFuntion;
sum = function(a: number, b: number): number{
return a + b;
}
// 인덱싱
// 배열의 인덱스는 항상 숫자. 0 부터 시작
interface StringArray{
[index: number]: string; // index 는 기존처럼 number 을받고, : 옆에 타입을 지정 할 수 있다.
}
let arr: StringArray = ['a','b','c'];
arr[0] = 10 // 오류
// index를 이용해서 number 로 접근을 하는 것은 맞다.
// 하지만 배열안에 들어간 모든 타입은 string으로 선언되었기 때문에 오류가 난다.
extends
키워드 사용// 인터페이스 확장
// extends 키워드 사용,
interface Person {
name: string;
age: number;
}
// 아래와 같은 인터페이스가 있다면, 중복되는 값들을 다른 인터페이스가 가지고 있는 경우
// interface Developer {
// name: string;
// age: number;
// language: string;
//}
interface Developer extends Person {
language: string;
}
// 오답
let john: Developer = {
language: 'ts', // 에러 발생.
// developer 를 person으로 확장을 받았기 때문에 person에 있는 타입들 까지 정의를 해주는 것이 규칙
// age: 20,
// name: '존'
}
// 정답
let john: Developer = {
language: 'ts'
age: 20,
name: '존'
}
interface 인터페이스_이름 {
속성?: 타입;
}
interface CraftBeer {
name: string;
hop?: number;
}
let myBeer = {
name: 'Saporo'
};
function brewBeer(beer: CraftBeer) {
console.log(beer.name); // Saporo
}
brewBeer(myBeer);
readonly
키워드 사용interface CraftBeer {
readonly brand: string;
}
let myBeer: CraftBeer = {
brand: 'Belgian Monk'
};
// 인터페이스로 객체를 선언하고 나서 수정하려고 하면 아래와 같이 오류가 납니다.
myBeer.brand = 'Korean Carpenter'; // error!