let x = 3;
x
의 타입을 따로 지정하지 않더라도 x
는 number
로 간주된다. 변수, 속성, 인자의 기본 값, 함수의 반환 값 등을 설정할 때 이와 같은 타입 추론이 일어난다.let x = [0, 1, null];
// let x: (number | null)[]
window.onmousedown = function(mouseEvent) {
console.log(mouseEvent.button);
console.log(mouseEvent.kangaroo); // error
}
window.onmousedown
에 할당되는 함수의 타입을 추론하기 위해 window.onmousedown
의 타입을 검사한다. 타입 검사가 끝나면 함수의 타입이 마우스 이벤트와 연관이 있다고 (mouseEvent
의 타입이 MouseEvent
라고) 추론한다. 따라서 mouseEvent
에 kangaroo
속성이 없다고 결론을 내린다.interface Ironman {
name: string;
}
class Avengers {
name: string;
}
let i: Ironman;
i = new Avengers(); // structural typing에 의해 에러가 발생하지 않는다.
class Hulk {
handSize: number;
constructor(name: string, numHand: number) {}
}
class Captain {
handSize: number;
constructor(numHand: number) {}
}
let h: Hulk;
let c: Captain;
// 속성이 같으므로(둘 다 handSize를 가짐) 서로 할당 가능
// 만약 한 클래스가 다른 클래스에 없는 속성을 가진다면 해당 속성이 없는 쪽에서는 할당 불가
h = c;
c = h;
<T>
가 속성에 할당되었는지를 기준으로 체크interface Empty<T> {}
let x: Empty<number>;
let y: Empty<string>;
x = y;
// 타입 별칭을 사용할 경우
type MyName = string;
const name: MyName = 'YJ';
// 타입 별칭을 사용하지 않을 경우
const name: string = 'YJ';
string
, name
과 같은 간단한 타입뿐만 아니라 인터페이스, 제네릭에도 사용할 수 있음