Object는 특별하니깐 😁
오브젝트는 type alias로 타입을 미리 선언 할수도 있고
interface
라는 keyword로 타입을 선언 할 수 있다 .
// interface 작성 할 때 '=' 안붙인다.
interface Square{
color: string
width : number
}
let square : Square ={
color: '#000',
width: 100
}
interface는 object랑 비슷한 모습으로 작성하면 된다.
{ ... }
안에 타입을 명시해주면 끄읕 (참고) 한 줄 끝나면 콤마대신 세미콜론도 가능하고 둘다 안해도 compiler가 딴지 안걸긴 함.
interface의 extends 키워드는 class에서 사용하는 keyword와 유사하게 상속과 비슷하다 .
Sample
interface Student {
name :string,
}
interface Teacher {
name :string,
age :number,
}
중복인 name이라는 type이 보이는데 멋진 개발자라면 통일할 줄 알아야 할듯 하다.
이럴 때 사용 할 수 있는 extends 를 사용해서 줄여보자
interface Student {
name :string,
}
interface Teacher extends Student {
age :number
}
이제 Teacher 라는 interface는 age
, name
이라는 타입속성을 가지게 된다.
interface TodoListFunc {
addTodo : (x:string) => string[],
deleteTodo: (num:number)=> string[]
}
const todoListFunc : TodoListFunc = {
addTodo(x){
return [] as string[]
},
deleteTodo(num){
return [] as string[]
}
}
이런식으로 차근차근 생각하며 코드를 짜보자!
type alias와 interfac는 거의 똑같지만 extends
할 수 있다는 정도의 차이점이 있는데
type alias에서 interface의 extends
와 같이 합치려면
// type alias 의 & 기호
type Animal = {
name :string
}
type Cat = Animal & { legs: number }
// interface의 extends
interface Animal {
name: string
}
interface Cat extends Animal {
legs: number
}
이러한 차이점이라고 말 할 수 있겠지만
사실 interface도 &
가능하다.
// interface에서도 & 기호 사용가능
interface Animal {
name: string
}
interface Cat {
legs: number
}
let cat : Cat & Animal = {
name: 'di',
legs: 4
}
그렇다면 무슨 차이점이 있을까?
interface Animal {
name :string
}
interface Animal {
legs :number
}
// 이것으로 확정된다.
interface Animal {
name: string
legs : number
}
interface에서는 타입이름 중복선언을 허용해주며 중복시 extends 한 것으로 간주하며, 동일하게 동작한다 .
type Animal = {
name :string
}
type Animal = {
legs :number
}
type의 경우 에러남 - 엄격근엄진지하다랄까...
interface Animal {
name: string
}
interface Dog extends Animal{
name: number
}
타입에러가 난다 .
그렇다면
interface Animal {
name: string
}
interface Animal{
name: number
}
이렇게 하면 마지막에 있는 name의 타입이 number 가 될까?
안된다.