
let a = 10;
// number 타입으로 추론
타입스크립트는 타입이 정의되어 있지 않은 변수의 타입을 자동으로 추론한다.
function func(param){ // 오류
}
함수의 매개변수 타입은 자동으로 추론할 수 없다.
타입 추론이 불가능한 변수(ex 매개변수)에는 암시적으로 any 타입이 추론된다.엄격한 타입 검사 모드 (tsconfig.json의 strict 옵션을 true로 설정)에서는
이런 암시적 any 타입의 추론을 오류로 판단한다.
let a = 10;
// number 타입으로 추론
let b = "hello";
// string 타입으로 추론
let c = {
id: 1,
name: "이정환",
profile: {
nickname: "winterlood",
},
urls: ["https://winterlood.com"],
};
// id, name, profile, urls 프로퍼티가 있는 객체 타입으로 추론
// 복잡한 객체 타입도 문제 없이 잘 추론한다.
일반적인 변수 선언의 경우 초기값을 기준으로 타입이 잘 추론된다.
let { id, name, profile } = c;
let [one, two, three] = [1, "hello", true];
객체와 배열을 구조 분해 할당하는 상황에서도 타입이 잘 추론된다.
function func() {
return "hello";
}
// 반환값이 string 타입으로 추론된다
함수 반환값의 타입은 return 문을 기준으로 잘 추론된다.
function func(message = "hello") {
return "hello";
}
기본값이 설정된 매개변수의 타입은 기본값을 기준으로 추론됩니다.
let d;
// 암시적인 any 타입으로 추론
변수를 선언할때 초기값을 생략하면 암시적인 any 타입으로 추론된다.
이때 매개변수의 타입이 암시적 any로 추론될 때와 달리,
일반 변수의 타입이 암시적 any 타입으로 추론되는 상황은 오류로 판단하지 않는다.
let d;
d = 10;
d.toFixed();
d = "hello";
d.toUpperCase();
d.toFixed(); // 오류
d = 10;
d.toFixed();
d.toUpperCase(); // 오류
그리고 이 변수에 값을 할당하면
그 다음 라인부터 any 타입이 해당 값의 타입으로 변화한다.
다음 라인부터는 d가 number 타입이 되고,
d = “hello” 다음 라인부터는 d가 string 타입이 된다.이렇게 암시적으로 추론된 any 타입은 코드의 흐름에 따라 타입이 계속 변화한다.
이를any의 진화라고 표현하기도 한다.
const str = "hello";
// "hello" String Literal 타입으로 추론
const num = 10;
// 10 Number Literal 타입으로 추론
const로 선언된 상수도 타입 추론이 진행됩니다.
상수는 초기화 때 설정한 값을 변경할 수 없기 때문에
특별히 가장 좁은 타입으로 추론된다.
let arr = [1, "string"];
// (string | number)[] 타입으로 추론
다음과 같이 다양한 타입의 요소를 담은 배열을 변수의 초기값으로 설정하면,
최적의 공통 타입으로 추론된다.