반응형
클래스 선언부 타입 정의
interface PhoneNumberDictionary {
[phone: string]: {
num: number;
};
}
interface Contact {
name: string;
address: string;
phones: PhoneNumberDictionary;
}
// api
// TODO: 아래 함수의 반환 타입을 지정해보세요.
function fetchContacts(): Promise<Contact[]> {
// TODO: 아래 변수의 타입을 지정해보세요.
const contacts: Contact[] = [
{
name: 'Tony',
address: 'Malibu',
phones: {
home: {
num: 11122223333,
},
office: {
num: 44455556666,
},
},
},
{
name: 'Banner',
address: 'New York',
phones: {
home: {
num: 77788889999,
},
},
},
{
name: '마동석',
address: '서울시 강남구',
phones: {
home: {
num: 213423452,
},
studio: {
num: 314882045,
},
},
},
];
return new Promise(resolve => {
setTimeout(() => resolve(contacts), 2000);
});
}
/* ------------------------------------------------ */
// main
class AddressBook {
// TODO: 아래 변수의 타입을 지정해보세요.
contacts: Contact[] = [];
constructor() {
// constructor - 클래스가 실행될때 초기화 될 코드를 넣는다.
this.fetchData();
}
fetchData(): void {
fetchContacts().then(response => {
this.contacts = response;
});
}
/* ------------------------------------------------ */
}
- AddressBook Class의 contacts 변수는 멤버 변수다.
- constructor() 로 AddressBook 클래스가 실행될때 초기화 될 코드를 넣는다.
- fetchData() 메서드에 fetchContacts() 라는 비동기 함수를 호출해서 .then() 으로 성공했을시 데이터를 받아와서
- AdrressBook 함수의 멤버변수인 contacts에 할당한다.
메서드 타입 정의
interface PhoneNumberDictionary {
[phone: string]: {
num: number;
};
}
interface Contact {
name: string;
address: string;
phones: PhoneNumberDictionary;
}
// api
// TODO: 아래 함수의 반환 타입을 지정해보세요.
function fetchContacts(): Promise<Contact[]> {
// TODO: 아래 변수의 타입을 지정해보세요.
const contacts: Contact[] = [
{
name: 'Tony',
address: 'Malibu',
phones: {
home: {
num: 11122223333,
},
office: {
num: 44455556666,
},
},
},
{
name: 'Banner',
address: 'New York',
phones: {
home: {
num: 77788889999,
},
},
},
{
name: '마동석',
address: '서울시 강남구',
phones: {
home: {
num: 213423452,
},
studio: {
num: 314882045,
},
},
},
];
return new Promise(resolve => {
setTimeout(() => resolve(contacts), 2000);
});
}
// main
class AddressBook {
// TODO: 아래 변수의 타입을 지정해보세요.
contacts: Contact[] = [];
constructor() {
// constructor - 클래스가 실행될때 초기화 될 코드를 넣는다.
this.fetchData();
}
fetchData(): void {
fetchContacts().then(response => {
this.contacts = response;
});
}
/* TODO: 아래 함수들의 파라미터 타입과 반환 타입을 지정해보세요 */
findContactByName(name: string): Contact[] {
// filter를 하기 떄문에 배열로 리턴된다.
// filter 결과가 1개인지 2개인지 모르기 떄문에 배열에 담김
return this.contacts.filter(contact => contact.name === name);
}
findContactByAddress(address: string): Contact[] {
return this.contacts.filter(contact => contact.address === address);
}
findContactByPhone(phoneNumber, phoneType: string): Contact[] {
return this.contacts.filter(
contact => contact.phones[phoneType].num === phoneNumber
);
}
addContact(contact: Contact): void {
this.contacts.push(contact);
}
displayListByName(): string[] {
return this.contacts.map(contact => contact.name);
}
displayListByAddress(): string[] {
return this.contacts.map(contact => contact.address);
}
/* ------------------------------------------------ */
}
new AddressBook();
enum을 이용한 타입정의
interface PhoneNumberDictionary {
[phone: string]: {
num: number;
};
}
interface Contact {
name: string;
address: string;
phones: PhoneNumberDictionary;
}
/* ------------------------------------------------ */
enum phoneType {
Home = 'home',
Office = 'office',
Studio = 'studio',
}
/* ------------------------------------------------ */
// api
// TODO: 아래 함수의 반환 타입을 지정해보세요.
function fetchContacts(): Promise<Contact[]> {
// TODO: 아래 변수의 타입을 지정해보세요.
const contacts: Contact[] = [
{
name: 'Tony',
address: 'Malibu',
phones: {
home: {
num: 11122223333,
},
office: {
num: 44455556666,
},
},
},
{
name: 'Banner',
address: 'New York',
phones: {
home: {
num: 77788889999,
},
},
},
{
name: '마동석',
address: '서울시 강남구',
phones: {
home: {
num: 213423452,
},
studio: {
num: 314882045,
},
},
},
];
return new Promise(resolve => {
setTimeout(() => resolve(contacts), 2000);
});
}
// main
class AddressBook {
// TODO: 아래 변수의 타입을 지정해보세요.
contacts: Contact[] = [];
constructor() {
// constructor - 클래스가 실행될때 초기화 될 코드를 넣는다.
this.fetchData();
}
fetchData(): void {
fetchContacts().then(response => {
this.contacts = response;
});
}
/* TODO: 아래 함수들의 파라미터 타입과 반환 타입을 지정해보세요 */
findContactByName(name: string): Contact[] {
// filter를 하기 떄문에 배열로 리턴된다.
// filter 결과가 1개인지 2개인지 모르기 떄문에 배열에 담김
return this.contacts.filter(contact => contact.name === name);
}
findContactByAddress(address: string): Contact[] {
return this.contacts.filter(contact => contact.address === address);
}
/* ------------------------------------------------ */
findContactByPhone(phoneNumber: number, phoneType: string): Contact[] {
return this.contacts.filter(
contact => contact.phones[phoneType].num === phoneNumber
);
}
/* ------------------------------------------------ */
addContact(contact: Contact): void {
this.contacts.push(contact);
}
displayListByName(): string[] {
return this.contacts.map(contact => contact.name);
}
displayListByAddress(): string[] {
return this.contacts.map(contact => contact.address);
}
}
/* ------------------------------------------------ */
const addressBook = new AddressBook();
addressBook.findContactByPhone(55, phoneType.Home);
/* ------------------------------------------------ */
- findContactByPhone('hommee'); 이런식으로 오탈자가 충분히 날 수 있다.
- 그래서 함수에 들어갈 타입을 변수로 만들어서 사용하는게 안전하다.
- phoneType을 string으로 받는게 아니라 받을 수 있는 속성인 home, office, studio를 enum으로 만들자
반응형
'TypeScript > TypeScript - 기초부터 실전까지' 카테고리의 다른 글
21. 타입 추론 (Type Inference) (0) | 2023.10.14 |
---|---|
20. map() - 특정 배열을 변환하여 새로운 배열을 만든는 함수 (0) | 2023.10.14 |
18. API 함수 타입 정의 | Promise<Contact[]> (0) | 2023.10.14 |
17. tsconfig.json, .eslintrc.js 설정 (0) | 2023.10.14 |
16. 제네릭의 타입 제한방법 3가지 | keyof (0) | 2023.10.09 |