index signature
Index Signature은 객체의 속성 이름과 타입이 미리 정의되어 있지 않을 때, 객체에 동적으로 속성을 추가할 수 있는 방법을 제공한다.
기본형태
interface Obj{
[key : T] : U
}
// T : 인덱스의 타입 (대부분 string 이나 number)
// U : 값의 타입
사용 예시
type Score = "A" | "B" | "C"
interface User {
name: string
age: number
[grade: number]: Score
}
let user: User = {
name: "xx",
age: 30,
1: "A",
2: "B",
}
index signature를 사용하면 타입 체크 시 유연성이 증가하지만, 해당 객체의 명확한 구조를 판단할 수 없기 때문에 주의해서 사용해야 한다.
implements
클래스가 특정 인터페이스를 충족시키도록 강제하는 데 사용한다. 인터페이스는 메서드와 속성의 이름 및 타입을 정의할 수 있는 구조적 타이핑 시스템의 일부이다.
클래스가 인터페이스를 구현할 때, 그 클래스는 인터페이스에 정의된 모든 속성과 메서드를 구현해야 한다.
이를 통해서 typescript는 타입 안정성을 제공하며, 객체 지향 디자인 원칙을 따르는 코드를 작성하는데 도움이 된다.
사용 예시
interface Animal {
speak() : string;
}
class Dog implements Animal{
speak(){
return '멍!'
}
}
Dog 클래스는 Animal 인터페이스를 구현하기 때문에 speak 메서드가 포함되어야 한다.
만약 Dog 클래스에서 speak 메서드가 없다면 오류가 발생할 것이다.
핵심
- 클래스는 여러 인터페이스를 구현할 수 있으며 각 인터페이스는 쉼표로 구분된다.
class A implements a,b,c {}
- 'implements'는 클래스가 인터페이스의 구조적 계약을 준수하도록 강제하여, 타입 안정성과 예측 가능한 코드 구조를 제공한다.
- 인터페이스 내의 속성이 선택적(optional) 일 때, 클래스는 그 속성을 반드시 구현할 필요가 없다.
interface Employee {
id:number;
name:string;
email?:string;
}
class PartTimeEmployee implements Employee {
id:number
name:string
constructor(id:number, name:string){
this.id = id;
this.name = name;
}
}
class FullTimeEmployee implements Employee {
id:number
name:string
email:string
constructor(id:number, name:string, email:string) {
this.id = id;
this.name = name;
this.email = email;
}
}
PartTimeEmployee와 FullTimeEmployee 모두 Employee 인터페이스를 이용하여 구현했지만, email은 선택적 요소로 필요한 클래스에서만 포함하여 구현할 수 있다.
extends
인터페이스를 확장할 때 사용할 수 있다.
interface Car {
color:string;
wheel:number;
start():void;
}
interface Bmw extends Car{
door:number;
stop():void;
}
interface Toy {
type : string
}
const bmw :Bmw = {
door: 4,
wheel: 4,
color: 'blue',
stop : () => {
console.log("stop!!")
},
start: ()=>{
console.log('start!!')
}
}
interface BmwToyCar extends Bmw, Toy {
price : number
}
const bmwtoycar : BmwToyCar = {
price: 0,
door: 0,
stop: ()=>{},
color: "",
wheel: 0,
start: ()=>{},
material: ""
}
Bmw 인터페이스를 이용하게 되면 Bmw 내부에서 쓴 것뿐만 아니라 Car 안에 포함되어 있는 속성도 다 작성해야 한다.
implements와 마찬가지로 여러 인터페이스를 이용해서 확장할 때 쉼표로 구분한다.
'🟨 JavaScript 🟨 > 🟦TypeScript🟦' 카테고리의 다른 글
TypeScript - class (feat.예시코드) (1) | 2024.02.22 |
---|---|
TypeScript - function (0) | 2024.02.22 |
Jest를 이용한 TDD(Test-Driven Development) (0) | 2023.04.24 |
객체 지향 프로그래밍(OOP) 예제코드 (0) | 2023.04.21 |
브라우저 환경에서의 TypeScript (0) | 2023.04.21 |
댓글