extends
키워드로 타입 정의를 확장한 것class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
logAge() {
console.log(this.age);
}
}
class Developer extends Person {
constructor(name, age, skill) {
super(name, age); // 부모에서 받아온 것은 super로 표시
this.skill = skill;
}
logDeveloperInfo() {
this.logAge(); // 부모에서 가져온 메서드는 super 없이 this만 붙여 바로 사용 가능
console.log(this.name);
console.log(this.skill);
}
}
interface Person {
name: string;
age: number;
}
interface Developer extends Person {
name: number; // 부모의 것을 자식이 변경하면 에러 발생
}
interface Hero {
power: boolean;
}
interface Person extends Hero {
name: string;
age: number;
}
interface Developer extends Person {
skill: string;
}
let ironman: Developer = {
name: '아이언맨',
age: 21,
skill: '만들기',
power: true
}
interface StringArray {
[index: number]: string; // 배열 인덱싱 방식의 타입 정의
}
let companies: StringArray = ['삼성', '네이버', '구글'];
index
: '인덱스'를 나타내는 변수[index: number]
: 변수 index 자리에는 number 타입이 들어옴[index: number]: string
: 변수 index(key)의 value 자리에는 string 타입이 들어옴하지만 이런 방법보다는
let companies: string[] = ['삼성', '네이버', '구글']
이라고 타입을 정의하는 게 훨씬 간편하다. (배열도 인덱싱 방식의 타입 정의가 가능하다는 예시일 뿐)
interface SalaryMap {
[level: string]: number;
}
let salary: SalaryMap = {
junior: 100
};
이처럼 속성명을 변수화해서 key 타입을 정의하는 것을 인덱스 시그니처 방식이라고 한다.
// 객체 인덱싱을 안 쓴 경우 - 여러 줄 선언 필요
interface SalaryMap {
junior: number;
mid: number;
senior: number;
...
}
// 객체 인덱싱을 쓰면 - key가 '변수'로 대체되기 때문에 한 줄로 선언 가능
interface SalaryMap {
[level: string]: number;
}
interface User { // 명시법과 인덱스 시그니처를 섞어서 사용한 예시
[property: string]: string;
id: string;
name: string;
}
let seho: User = {
id: '1',
name: '세호',
};
[property: string]: string;
라인 덕분에 key 값과 value 값이 모두 string인 다른 속성을 계속 추가 가능let seho: User = {
id: '1',
name: '세호',
address: '판교' // 예: 추가!
};