interface: Object에 타입지정하려면
type 키워드로 타입 변수를 생성할 수 있다고 했다.
근데 object의 경우에는 초이스가 두 가지다.
- type 키워드로 타입변수 생성 가능
- interface 키워드도 타입변수 생성 가능
네모 라는 오브젝트가 있다고 해보자.
1) type 키워드로 타입변수 생성
let 네모 = {
color: 'red',
width: 100
}
이거 타입지정하려면 어떻게 해야하나? 타입은 자동으로 된다!
근데 만약 어려운 타입이 미리 들어가야 한다, 하면 type alias를 만들어서 쓰면 된다.
type Square = { color :string, width :number };
2) object 타입지정 시 interface 사용가능
interface Square { color :string, width :number};
- 등호 (=)는 필요없다.
- class 만드는 법이랑 유사하다 (작명하고 중괄호 안에 작성).
- ,콤마 대신 ;세미콜론 써도 된다. 맘에 드는 거 쓰면 된다.
interface Square {
color :string;
width :number;
};
Q. 이거 타입지정 interface 써서 해보기
let 학생 = { name: 'kim'};
let 선생 = { name: 'kim', age: 20}
A.
interface Student {
name :string;
}
interface Teacher {
name :string;
age :number;
}
let 학생 :Stuednet = { name: 'kim'};
let 선생 :Teacher = { name: 'kim', age: 20}
type vs interface
interface 장점: 'extends'로 복사 가능
지금 Student, Teacher에서 name 속성이 중복된다. 각 interface를 쓰는게 아니라, Student를 복사해서 Teacher를 만들면 되지 않나. interface는 extends를 이용해서 그게 가능하다.
interface Student {
name :string;
}
interface Teacher extends Student {
age :number;
}
type alias의 & 기호(intersection type)
& 기호(intersection type)
- 두 타입을 전부 만족하는 타입이라는 뜻
근데 interface의 extends는 type alias 의 & 기호로도 유사한 기능이 가능한데..
type Animal = { name: string };
type Cat = { age: number} & Animal; // 왼 & 오 만족하는 type 생성
type vs interface
- **interface는 중복선언 가능**
- **type은 중복선언 불가능**
interface Student {
name :string;
};
interface Student {
score :number;
}
// Student = {name :string, score :number}
에러 없이 가능하다. 중복 선언하면 자동으로 extends가 된다.
근데 type은 엄격해서 중복선언이 안된다.
type Animal = { name: string };
type Animal = { age: number }; // Error: Duplicate identifier 'Animal'. ts(2300)
ts로 작성된 외부 라이브러리는 interface를 많이 쓴다. type이 아니라.
왜냐하면 interface를 갖다 쓸 때, 사람들이 커스텀마이징할 수 있기 때문이다(속성 추가 가능).
그래서 **다른 사람이 이용많이 할 것 같으면 object 타입을 정할 때 interface를 쓰자**.
extends 쓸 때 중복속성 발생하면? -> 에러로 잡아줌
interface Student {
name :string;
}
interface Teacher extends Student{
name: number; // 에러 발생
}
왜냐하면
interface Teacher textends Student {
name: string;
name: number;
}
이 코드랑 동일하기 때문에 에러 발생한다.
& 쓸 때 중복속성 발생하면? -> 미리 에러안나서 주의
type Animal = { name: string };
type Cat = { name: number} & Animal; // 에러 없음
에러가 안난다. 그런데 여기선
let 야옹이 :Cat = { name: 'kim' }; // 에러 발생
에러가 발생한다. 왜냐하면 **&는 합치는게 아니라 왼쪽 오른쪽 둘 다 만족하는 타입이기 때문**이다.
interface가 더 안전해보인다. 미리 에러를 내주니까.
숙제
1) interface 이용해서 간단하게 타입을 만들어봅시다
let 상품 = { brand : 'Samsung', serialNumber : 1360, model : ['TV', 'phone'] }
이런 변수가 있는데 interface 키워드로 타입지정 이쁘게 하고 싶습니다. 어떻게 코드를 짜면 될까요?
무슨 타입일지는 알아서 기입합시다.
➡️
interface Product {
brand : string,
serialNumber : number,
model : string[]
}
let 상품 :Product = { brand : 'Samsung', serialNumber : 1360, model : ['TV', 'phone'] };
2) array 안에 object 여러개가 필요합니다.
쇼핑몰 장바구니를 구현하려고 하는데
let 장바구니 = [ { product : '청소기', price : 7000 }, { product : '삼다수', price : 800 } ]
이렇게 생긴 object들이 잔뜩 들어갈 수 있는 array는 어떻게 타입을 지정해야할까요?
오늘 배운 interface 문법을 써봅시다.
➡️
interface Basket {
product : string,
price : number
}
let 장바구니 :Cart[] = [ { product : '청소기', price : 7000 }, { product : '삼다수', price : 800 } ];
3) 위에서 만든 타입을 extends 해봅시다.
갑자기 서비스가 업데이트되어서 일부 상품은 card 속성이 들어가야합니다.
{ product : '청소기', price : 7000, card : false }
위에서 만든 interface를 extends 해서 이 object의 타입을 만들어보십시오.
➡️
interface Basket {
product : string,
price : number
}
interfacef NewBasket {
card : boolean
}
4) object 안에 함수를 2개 넣고 싶은데요
- 이 object 자료는 plus() 함수를 내부에 가지고 있으며 plus 함수는 파라미터 2개를 입력하면 더해서 return 해줍니다.
- 이 object 자료는 minus() 함수를 내부에 가지고 있으며 minus 함수는 파라미터 2개를 입력하면 빼서 return 해줍니다.
이 object 자료를 어떻게 만들면 될까요?
interface를 이용해서 object에 타입지정도 해보십시오.
➡️
interface Calculator {
plus : (a:number, b:number) => number;
minus : (a:number, b:number) => number;
}
let 오브젝트 : Calculator = {
plus(a,b){
return a + b;
}
minus(a,b){
return a - b;
}
}
'Front-End: Web > TypeScript' 카테고리의 다른 글
[코딩애플] ts part 2-2. Type Narrowng(2) (0) | 2022.10.23 |
---|---|
[코딩애플] ts part 2-1. rest parameter & destructuring (0) | 2022.10.22 |
[코딩애플] ts part 1-10. class types (0) | 2022.10.22 |
[코딩애플] ts part 1-9. TypeScript DOM Manupulation (0) | 2022.10.22 |
[코딩애플] ts part 1-8. method types (0) | 2022.10.22 |