const userName1 = "Bob"
let userName2 = "Tom"
let은 변할 수 있기에 마우스를 올리면 type이 string으로 표시된다.
const는 변할 수 없는 값이기에 Bob 이외의 값을 가질 수 없다. 
let userName2 = "Tom"
let userName2: string | number = "Tom"
userName2 = 3
userName2은 최초 할당된 값이 string이 였지만 타입이 다른 값을 추가하고 싶다면 type을 선언해준다.
[type을 통해서 enum 비슷한 형태를 만들 수 있다. ]
type Job= "police"  | "developer" | "teacher"
interface User{
   name:string,
   job: Job
}
const user: User = {
   name: "Bob",
   job: 'police'
}
||을 의미한다.
동일한 속성을 타입을 다르게해서 구분할 수 있게 도와주는것이 식별 가능한 유니온 타입이라고 한다. 
interface Car{
   name: "Car"
   color: string
   start(): void
}
interface Mobile{
   name: "mobile"
   color: string
   call(): void
}
function getGift(gift: Car | Mobile){
   console.log(gift.color) //둘다 갖고있기에 color는 나옴
   if(gift.name === "Car"){ //먼저 확인
      gift.start() 
   }else{
     gift.call()
   }
}
gift는 union타입을 사용하여 car 또는 mobile을 받는다.
동일한 속성의 name을 줬지만 타입을 다르게 줌으로써 두 개의 인터페이스를 구분할 수 있게 된다. 

gift에 마우스를 오버했더니 parameter를 알 수 있다.
예문에는 if를 사용했지만, 검사해야할 항목이 많아지면 swich를 사용하는게 가속성에 좋다.
교차타입은 &&를 의미한다.
여러개 타입을 하나로 합쳐주는 역할을 한다.
그래서 필요한 모든 기능을 가진 하나의 타입이 만들어 진다. 
interface Car{
   name: string
   start(): void
}
interface Toy{ 
   name: string
   color: string
   price: number
}
const toyCar: Toy & Car = {
   name: "타요",
   start(){},
   color: "blue",
   price: 1000
}
toyCar의 속성은 Toy와 Var의 interface를 모두 가지고 있다.
이럴 경우 두 interface속성을 모두 가지고 있어야한다.