클래스의 인터페이스 구현
- 타입스크립트에서 인터페이스를 일반적인 객체지향의 인터페이스 개념처럼 사용할 수 있다.
- 클래스가 약속된 시그니처의 형태를 맞추는 것이다.
implements
키워드를 이용하여 인터페이스의 구현을 강제할 수 있다.
interface Person {
name: string;
hello(): string;
}
implements Person
을 덧붙여서 인터페이스 구현을 선언했으므로name
과hello()
프로퍼티를 반드시 구현해야 한다.
class Worker implements Person {
name: string;
constructor(name: string) {
this.name = name;
}
hello() {
return `안녕. 난 ${this.name}.`;
}
work() {
return `${this.name} 은(는) 일을 합니다.`;
}
}
다중 인터페이스 구현
- 인터페이스는 몇개든 구현할 수 있다.
interface Walker {
walk(): string;
}
// 인터페이스는 몇개든 구현 가능
class Jake implements Person, Walker {
name: string;
constructor(name: string) {
this.name = name;
}
hello(): string {
return `안녕, 난 ${this.name}`;
}
walk(): string {
return `${this.name}. 걷는다.`;
}
}
- 2개의 인터페이스를 intersection (
&
) 을 통해 합친 타입을 통해서도 다중 인터페이스 구현이 가능하다.
type WalkingMan = Person & Walker;
class Jack implements WalkingMan {
name: string;
constructor(name: string) {
this.name = name;
}
hello(): string {
return `안녕, 난 ${this.name}`;
}
walk(): string {
return `${this.name}. 걷는다.`;
}
}
인터페이스의 프로퍼티가 중복될 때
- 다중 상속할 인터페이스가 중복된 프로퍼티 이름을 갖는 것을 주의해야 한다.
interface Student {
id: string;
}
interface Resident {
id: number;
}
- primitive 타입을 두개 intersection 하면
never
타입이 되기 때문에 가능한 타입이 없다. any
로 지정하면 어찌저찌 되긴 하는데 타입스크립트를 쓰는 의미가 사라진다.
class Troi implements Student, Resident {
id: string | number; // ERROR: 둘 중 어떤 쪽이 되어도 한 쪽을 만족하지 못함
}
인터페이스로 생성자 표현하기
- 인터페이스로 생성자를 표현하고 싶을 땐,
new
키워드를 이용하면 된다. - 반환 타입은 정의한 클래스 타입을 그대로 입력해주면 된다.
class Developer {
name: string;
language: string;
constructor(name: string, language: string) {
this.name = name;
this.language = language;
}
}
interface DeveloperConstructor {
new (name: string, language: string): Developer;
}
function createDeveloper(
constructor: DeveloperConstructor,
name: string,
language: string
) {
return new constructor(name, language);
}
console.log(createDeveloper(Developer, "jake", "java"));
반응형
'Typescript' 카테고리의 다른 글
TS030. 타입스크립트 클래스에서 메서드, 속성 오버라이딩 (0) | 2024.01.01 |
---|---|
TS029. 타입스크립트 클래스 상속 (0) | 2023.12.31 |
TS027. 타입스크립트에서의 클래스 선언 방식 (0) | 2023.12.31 |
TS026. 타입스크립트 오브젝트의 Key-Value Mapping 알아보기 (0) | 2023.12.31 |
TS025. 타입스크립트 옵셔널 vs Type | Undefined 의 차이 (0) | 2023.12.30 |