Skip to main content

인터페이스

  • 객체의 스펙(속성과 속성의 타입)
  • 함수의 파라미터
  • 함수의 스펙(파라미터, 반환 타입 등)
  • 배열과 객체를 접근하는 방식
  • 클래스

인터페이스를 인자로 받아 사용할 경우, 인터페이스에 정의된 속성, 타입의 조건만 만족한다면 객체의 속성 갯수가 더 많아도 상관 없다. 또한, 인터페이스에 선언된 속성 순서를 지키지 않아도 된다.

let person = { name: "Capt", age: 28 };

function logAge(obj: { age: number }) {
console.log(obj.age); // 28
}

logAge(person); // 28
// interface

interface personAge {
age: number;
}

function logAge(obj: personAge) {
console.log(obj.age);
}

let person = { name: "Capt", age: 28 };

logAge(person);

옵션 속성

인터페이스를 사용할 때 인터페이스에 정의되어 있는 속성을 모두 다 꼭 사용하지 않아도 된다.

interface 인터페이스_이름 {
속성?: 타입;
}
interface CraftBeer {
name: string;
hop?: number;
}

let myBeer = {
name: "Saporo",
};

function brewBeer(beer: CraftBeer) {
console.log(beer.name); // Saporo
}

brewBeer(myBeer);

옵션 속성을 사용하면 속성을 선택적으로 적용할 수 있을 뿐만 아니라 인터페이스에 정의되어 있지 않은 속성에 대해서 인지시킬 수 있다.

interface CraftBeer {
name: string;
hop?: number;
}

let myBeer = {
name: "Saporo",
};

function brewBeer(beer: CraftBeer) {
console.log(beer.brewery); // Error: Property 'brewery' does not exist on type 'Beer'
}

brewBeer(myBeer);

읽기 전용 속성

interface CraftBeer {
readonly brand: string;
}

let myBeer: CraftBeer = {
brand: "Belgian Monk",
};
myBeer.brand = "Korean Carpenter"; // error!

읽기 전용 배열

let arr: ReadonlyArray<number> = [1, 2, 3];

arr.splice(0, 1); // error
arr.push(4); // error
arr[0] = 100; // error

객체 선언 타입 체킹

타입스크립트는 인터페이스를 이용하여 객체를 선언할 때 좀 더 엄밀한 속성 검사를 진행한다.

interface CraftBeer {
brand?: string;
}

function brewBeer(beer: CraftBeer) {
// ..
}
brewBeer({ brandon: "what" }); // error: Object literal may only specify known properties, but 'brandon' does not exist in type 'CraftBeer'. Did you mean to write 'brand'?

타입 추론을 무시하고 싶다면 다음과 같이 선언한다.

let myBeer = { brandon: 'what' }';
brewBeer(myBeer as CraftBeer);

인터페이스에 정의하지 않은 속성을 추가로 사용하고 싶다면 다음과 같은 방법을 사용한다.

interface CraftBeer {
brand?: string;
[propName: string]: any;
}

함수 타입

interface login {
(username: string, password: string): boolean;
}

let loginUser: login;
loginUser = function (id: string, pw: string) {
console.log("로그인 했습니다");
return true;
};

클래스 타입

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 CraftBeer {
(beer: string): string;
brand: string;
brew(): void;
}

function myBeer(): CraftBeer {
let my = function (beer: string) {} as CraftBeer;
my.brand = "Beer Kitchen";
my.brew = function () {};
return my;
}

let brewedBeer = myBeer();
brewedBeer("My First Beer");
brewedBeer.brand = "Pangyo Craft";
brewedBeer.brew();