인터페이스는 상호 간에 정의한 약속 혹은 규칙을 의미합니다. 타입스크립트에서의 인터페이스는 보통 다음과 같은 범주에 대해 약속을 정의할 수 있습니다.
- 객체의 스펙(속성과 속성의 타입)
- 함수의 파라미터
- 함수의 스펙(파라미터, 반환 타입 등)
- 배열과 객체를 접근하는 방식
- 클래스
인터페이스 맛보기
인터페이스에 대해 알아볼 수 있는 간단한 예제를 봅시다.
let person ={name : 'zontae' ,age : 10};
function logAge(obj : {age:number}){
console.log(obj.age); //10
}
logAge(person)
위 logAge() 함수에서 받는 인자의 형태는 age를 속성으로 갖는 객체입니다. 이렇게 인자를 받을 때 단순한 타입 뿐만 아니라 객체의 속성 타입까지 정의할 수 있죠.
만약 여기에 인터페이스를 적용하면 어떤 모습일까
interface personAge{
age:number;
}
function logAge(obj :personAge){
console.log(obj.age); //10
//console.log(obj.name)//오류난다
}
let person2 ={name : 'zontae' ,age : 10};
logAge(person2)
이제는 logAge()의 인자가 좀 더 명시적으로 바뀌었습니다. logAge()의 인자는 personAge 라는 타입을 가져야한다
그리고 위 코드를 보고 다음과 같이 추론할 수 있습니다. 인터페이스를 인자로 받아 사용할 때 항상 인터페이스의 속성 갯수와 인자로 받는 객체의 속성 갯수를 일치시키지 않아도 된다. 다시 말해, 인터페이스에 정의된 속성, 타입의 조건만 만족한다면 객체의 속성 갯수가 더 많아도 상관 없다는 의미입니다. 또한, 인터페이스에 선언된 속성 순서를 지키지 않아도 됩니다
옵션 속성
인터페이스를 사용할 때 인터페이스에 정의되어 있는 속성을 모두 다 꼭 사용하지 않아도 됩니다. 이를 옵션 속성이라고 합니다. 문법을 보겠습니다.
interface 인터페이스_이름 {
속성?: 타입;
}
이처럼 속성의 끝에 ?를 붙입니다. 이제 예시를 한번 볼까요.
interface personAge{
age:number;
name:string
hobby?:string
}
function logAge(obj :personAge){
console.log(obj.age); //10
console.log(obj.name)//'zontae'
}
let person2 ={name : 'zontae' ,age : 10};
logAge(person2)
코드를 보면 logage() 함수에서 personAge 인터페이스를 인자의 타입으로 선언했음에도 불구하고, 인자로 넘긴 객체에는 hobby 속성이 없습니다. 왜냐하면 hobby을 옵션 속성으로 선언했기 때문이죠
옵션 속성의 장점
옵션 속성의 장점은 단순히 인터페이스를 사용할 때 속성을 선택적으로 적용할 수 있다는 것 뿐만 아니라 인터페이스에 정의되어 있지 않은 속성에 대해서 인지시켜줄 수 있다는 점입니다.
interface personAge{
age:number;
name:string
hobby?:string
}
function logAge(obj :personAge){
console.log(obj.age); //10
console.log(obj.name)//'zontae'
console.log(obj.address)// adresss가 없으므로 오류가 난다.
}
let person2 ={name : 'zontae' ,age : 10};
logAge(person2)
객체 선언과 관련된 타입 체킹
타입스크립트는 인터페이스를 이용하여 객체를 선언할 때 좀 더 엄밀한 속성 검사를 진행합니다.
함수 타입
인터페이스는 함수의 타입을 정의할 때에도 사용할 수 있습니다.
interface bookcheck{
(bookname:string, booknumber :number):boolean;
}
함수의 인자의 타입과 반환 값의 타입을 정합니다.
let book: bookcheck
book = function(name:string,number:number){
console.log("해리포터")
return true;
}
클래스 타입
C#이나 자바처럼 타입스크립트에서도 클래스가 일정 조건을 만족하도록 타입 규칙을 정할 수 있습니다.
interface CraftBeer {
beerName: string;
nameBeer(beer: string): void;
}
class myBeer implements CraftBeer {
beerName: string = 'Baby Guinness';
nameBeer(b: string) {
this.beerName = b;
}
constructor() {}
}
인터페이스 확장
클래스와 마찬가지로 인터페이스도 인터페이스 간 확장이 가능합니다.
interface Person {
name: string;
}
interface Developer extends Person {
skill: string;
}
let fe = {} as Developer;
fe.name = 'josh';
fe.skill = 'TypeScript';
혹은 아래와 같이 여러 인터페이스를 상속받아 사용할 수 있습니다.
interface Person {
name: string;
}
interface Drinker {
drink: string;
}
interface Developer extends Person ,Drinker {
skill: string;
}
let fe = {} as Developer;
fe.name = 'josh';
fe.skill = 'TypeScript';
fe.drink = 'Beer';
'js > TypeScript' 카테고리의 다른 글
TypeScript - Class (0) | 2022.07.27 |
---|---|
TypeScript - 이넘(Enums) (0) | 2022.07.27 |
TypeScript - 함수 (0) | 2022.07.27 |
TypeScript - Union Type (0) | 2022.07.27 |
TypeScript - 기본 타입 (0) | 2022.07.26 |