이론 (Front-end)/TypeScript

[TypeScript] Interface(인터페이스)

이우열 2023. 12. 27. 19:45
728x90

✅ Interface란?

인터페이스는 object(객체) 모양을 특정해주기 위한 것

 

interface Player {
    nickname: string,
    team: Team,
    health: Health
}

type Player = {
    nickname: string,
    team: Team,
    health: Health
}

 

타입과 같이 인터페이스는 객체의 형태를 특정해주는 역할을 합니다.

 

 

✏️ 타입과의 차이점

type(타입)은 모든 타입의 모양을 설명하는 역할을 할 수 있지만
interface(인터페이스)는 object(객체)의 모양만을 설명하는 역할만 할 수 있습니다.

 

 

// 에러
interface Hello = string;

 

위와 같은 코드는 사용할 수 없습니다.

 

 

✅ interface 상속

interface User {
    name: string
}

interface Player extends User {
}

const nico: Player = {
    name: "gildong"
}

 

클래스와 동일하게 인터페이스에 인터페이스를 상속하여 사용할 수 있습니다.

extends를 사용하여 User 인터페이스를 Player에게 상속해줍니다.

 

 

✅ interface를 type으로

type User = {
    name: string
}

type Player = User & {
}

const nico: Player = {
    name: "gildong"
}

 

상속에서 작성한 예시를 바탕으로 interfacetype으로 변환한 코드 예시입니다.

 

type에서는 extends 대신 & 기호를 사용하여 상속합니다.

 

객체를 설명할 때는 type보다는 interface를 선호하는데

이는 문법 구조가 더 객체지향 프로그래밍처럼 보이기 때문입니다.

 

 

✅ interface readonly

interface User {
    readonly name: string
}

 

readonly 키워드를 붙여 읽기 전용 속성으로 만들 수도 있습니다.

 

 

✅ interface property 축적

interface User {
    name: string
}

interface User {
    lastName: string
}

interface User {
    health: number
}

const nico: User = {
    name: "gildong",
    lastName: "hong",
    health: 10
}

 

같은 이름을 가진 interface반복해서 사용하면 다른 이름을 가진 property들을 누적시킬 수 있습니다.

이는 type에서는 불가능한 문법입니다.

 

 

✅ abstract class에서 interface로 변환

✏️ abstract class(추상 클래스)

abstract class User {
    constructor(
    	protected firstName: string,
        protected lastName: string,
    ) {}
    abstract sayHi(name: string): string
    abstract fullName(): string
}

class Player extends User {
    fullName() {
        return `${this.firstName} ${this.lastName}`
    }
    sayHi(name: string) {
        return `Hello ${name}. My name is ${this.fullName()}`
    }
}

 

위는 Player 클래스가 추상 클래스인 User 클래스를 상속받는 예시입니다.

이 예시를 기준으로 추상 클래스를 인터페이스로 바꿔보도록 합시다.

 

✏️ interface(인터페이스)

interface User {
    firstName: string,
    lastName: string,
    sayHi(name: string): string,
    fullName(): string
}

class Player implements User {
    constructor(
    	public firstName: string,
        public lastName: string
    ) {}
    fullName() {
        return `${this.firstName} ${this.lastName}`
    }
    sayHi(name: string) {
        return `Hello ${name}. My name is ${this.fullName()}`
    }
}

 

인터페이스는 객체의 형태만을 지정해주는 것이 아닌 클래스의 형태를 지정해줄 수 있습니다.

 

  • 인터페이스로 변환한다면 우선 extends 대신 implements로 상속합니다.
  • 인터페이스에서는 추상 클래스와 달리 constructor 메소드가 없기 때문에 상속받은 Player 클래스에서 constructor 메소드를 작성해야 합니다.
  • 인터페이스를 상속한다면 요소들을 private이나 protected 키워드로 선언하지 못하고 public으로만 선언해야 합니다.

 

인터페이스를 사용하는 가장 큰 이유는 자바스크립트로 컴파일할 경우 인터페이스는 컴파일 되지 않아

자바스크립트 파일의 크기가 줄어든다는 장점이 있기 때문입니다.

 

 

✏️ class에 type 상속

type User = {
    firstName: string,
    lastName: string,
    sayHi(name: string): string,
    fullName(): string
}

class Player implements User {
    constructor(
    	public firstName: string,
        public lastName: string
    ) {}
    fullName() {
        return `${this.firstName} ${this.lastName}`
    }
    sayHi(name: string) {
        return `Hello ${name}. My name is ${this.fullName()}`
    }
}

 

interface와 같이 typeimplements를 통해 class에 상속시킬 수 있습니다.

 

 

✅ interface 중복 상속

interface User {
    firstName: string,
    lastName: string,
    sayHi(name: string): string,
    fullName(): string
}
interface Human {
    health: number
}

class Player implements User, Human {
    constructor(
    	public firstName: string,
        public lastName: string,
        public health: number
    ) {}
    fullName() {
        return `${this.firstName} ${this.lastName}`
    }
    sayHi(name: string) {
        return `Hello ${name}. My name is ${this.fullName()}`
    }
}

 

하나의 클래스에서 여러 개의 인터페이스를 상속받을 수 있습니다.

이 때, 변경된 요소를 상속받은 클래스의 constructor 메소드에 요소를 포함시켜주어야 합니다.

 

 

✅ interface를 type처럼 사용

interface User {
    firstName: string,
    lastName: string,
    sayHi(name: string): string,
    fullName(): string
}

function makeUser(user: User) {
    return "hi"
}

makeUser({
    firstName: "gildong",
    lastName: "hong",
    fullName: () => "xx",
    sayHi: (name) => "string"
})

 

makeUser라는 함수에서 인자로 User 인터페이스를 사용하므로써 객체의 형태를 지정해줄 수 있습니다.

 

 

✅ return 타입으로 interface 사용

interface User {
    firstName: string,
    lastName: string,
    sayHi(name: string): string,
    fullName(): string
}

function makeUser(user: User): User {
    return {
        firstName: "gildong",
        lastName: "hong",
        fullName: () => "xx",
        sayHi: (name) => "string"
    }
}

makeUser({
    firstName: "gildong",
    lastName: "hong",
    fullName: () => "xx",
    sayHi: (name) => "string"
})

 

위의 예시를 확장하여 return 타입에도 인터페이스를 사용할 수 있습니다.

 

new User와 같이 인스턴스를 만들 필요 없이

내용물인 객체만 인자로 넣으면 함수를 사용할 수 있고 객체 형태인 return 값이 나오게 됩니다.

728x90

'이론 (Front-end) > TypeScript' 카테고리의 다른 글

[TypeScript] Static 키워드  (0) 2023.12.27
[TypeScript] 타입 확장  (1) 2023.12.23
[TypeScript] Class(클래스)  (1) 2023.12.23
[TypeScript] 함수  (1) 2023.12.22
[TypeScript] 타입 시스템  (0) 2023.07.05