3
이라는 값으로부터 x
가 number
타입일 것이라 추론해낸다.let
대신 const
를 사용하면 어떨까? 타입스크립트는 이처럼 재할당이 불가능한 경우에는 변수의 타입을 보다 구체적인 숫자 리터럴 타입으로 추론한다. 이러한 속성은 인터페이스나 클래스의 readonly
속성에도 비슷하게 적용된다.1 | 3
이라는 타입을 추론하긴 불가능 할 것이다.dogAndCat
은 Dog
타입의 원소와 Cat
타입의 원소를 갖는 배열이다. 이러한 배열의 타입은 어떻게 추론해야 할까?dogAndCat
의 타입을 Array<Dog | Cat>
으로 추론하는 식이다.Animal
인터페이스를 호환받았으니 Array<Animal>
로 추론하면 되는 것 아닐지 궁금해 할 수 있다. 그렇게 동작하지 않는 이유를 이해하기 위해 다음 예제를 보자.dogAndCat
를 Array<Dog | Cat>
타입으로 추론한다. 따라서 다음 코드는 실제로 타입 검사를 통과한다. 아래 코드는 실제로 문제가 생길 여지가 없으므로 이는 바람직한 동작이다.Array<Animal>
로 추론한다면 어떻게 될지 생각해보자. getSoundFunction
함수는 Camel
타입을 인자로 받지 않는다. 그 때문에, dogAndCat
내에는 Camel
타입 값이 존재하지 않음에도 위의 코드에선 타입 에러가 날 것이다.Dog
와 Cat
)만을 재료로 사용한다. dogAndCat
이 Array<Animal>
타입을 갖길 원한다면 타입 추론에 의존하는 대신 명시적으로 타입 표기를 해 주면 된다.Window
인터페이스의 onmousedown
속성은 아래와 같이 정의되어 있다.(event: MouseEvent) => void
타입일 것이라고 추론한다. 이 때 함수 내부에서 event.a
속성에 접근하는데, a
속성은 MouseEvent
타입에 존재하지 않으므로 타입 에러가 발생한다.mouseEvent
매개변수의 타입을 표기해주면 위의 에러는 사라진다.