타입스크립트에서는 일반적으로 변수를 생성하고 초기화 하는 과정에서 타입을 추론해준다.

a 변수에 초기값으로 10을 넣으면 number타입의 값으로 초기화 되었기 때문에 타입스크립트는 a를 number타입이라고 추론한다 (타입 추론기준 = 변수의 초기값)

let a = 10 // a:number

복잡한 객체나 구조분해 할당 등등 다른 상황에서도 타입을 잘 추론해준다.

let b = 'hi'; // b: string
let c = {
    id: 1, //id: number
    name: 'heesu', // name: string 
    profile: {
        nickname: 'soo'
    },
    ect: ['ㅎㅎ',1] //ect: (string|number) []
}
let {id, name, profile} = c; // id:number, name: string ...
let [one, two, three] = [1,'hi',true]; // one: number, two: string ...

image.png

image.png

함수는 반환값을 기준으로 타입을 추론한다.

function func2(msg = 'hi'){ 
// msg:string 파라메터의 기본값이 있으면 기본값을 기준으로 타입을 추론한다.

    return 'hi' // func2(): string 함수는 반환값을 기준으로 타입을 추론한다.
}

function func(param) { 
    // 이 경우 파라메터로 어떤 값이 들어올지 알 수 없어서 타입추론이 불가하다.
}

any타입의 진화

초기값을 지정하지 않으면 해당 변수의 타입은 any가 된다. 하지만 아래 코드 처럼 값을 넣을때마다 변수의 타입이 계속 바뀌게 되는데 이를 any 타입의 진화라고 한다.

let d; // 여기선 any 타입

d = 10 // 여기부터 number타입
d.toFixed() // 가능
d.toUpperCase() // 숫자타입이니까 불가 

d= 'hi' // 여기부터는 string타입이 됨
d.toFixed() // string타입이라 불가 
d.toUpperCase() // 가능해짐

처음부터 any타입으로 지정해주면 어떤값이 들어가든 any타입이기 때문에 초기값을 지정하지 않은 변수와는 다른 케이스이다.

let c: any;
c = 10; // any
c = 'hi' // any
c = true // any

const로 선언시 리터럴타입이 된다.

const는 변하지 않는 상수이기 때문에 const로 변수를 선언하면 리터럴 타입이 된다. 아래 num변수는 number 타입이 아니고 10 넘버 리터럴 타입이다.

const num = 10;

image.png

타입 넓히기

num2 처럼 const가 아닌 let으로 선언했을 경우에는 변수에 숫자타입의 여러가지 값들이 들어갈 수 있다. (좀 더 범용적으로 사용할 수 있음)

이를 타입 넓히기라고 한다.