Web Front-end 공부/TypeScript

[TypeScript] 타입 추론 이해하기

Hanachoi 2023. 2. 27. 15:56

# let 과 const의 타입추론 (+ as const) 

  • let 과 const로 정의될 때 타입추론에 대한 차이가 있음 
let a ='Mark' // string
const b = 'Mark' // 'Mark' => literal type

let c = 38; // number
const d= 28 // 28 => litetal type

let e= false; // boolean
const f = false // false => literal type

let g = ['Mark', 'haeun'] // string[]
const h = ['Mark', 'haeun'] // string[]

const i = ['Mark', 'haeun', 'bokdong'] as const // readonly ['Mark', 'haeun', 'bokdong']

 

 

# Best common type

  • 가장 공통적인 타입을 추론해낸다
  • 밑의 예시에서 각각의 argument가 정확하게 정의되길 원한다면 위에서 본 as const를 사용해주면 된다.
let j = [0,1,null]; // (number | null)[]
let k = [0,1,null]; // (number | null)[]
  • 부모 class가 있고 자식 class가 있을 때는 각각의 자식 class가 union 타입으로 정의된다.
  • 부모의 타입으로 타입을 만들고 싶으면 정확히 정의를 해주거나 부모class가 그 배열 안에 같이 있으면 된다.
class Animal {}
class Rhino extends Animal {}
class Elephant extends Animal {}
class Snake extends Animal {}

let i = [new Rhino(), new Elephant(), new Snake()] // (Rhino | Elephant | Snake)[]
const m =[new Rhino(), new Elephant(), new Snake()] // (Rhino | Elephant | Snake)[]

//부모클래스가 같이 들어감
const n = [mew Animal(), new Rhino(), new Elephant(), new Snake()] // (Animal)[]
//정확히 부모클래스로 타입지정
const o: Animal[] = [new Rhino(), new Elephant(), new Snake()] // (Animal)[]

 

 

#Contextual Typing 

  • 위치에 따라 추론이 다르다
  • 아래의 예시를 보면, 타입스크립트가 window.onmousedown 의 함수 유형을 추론한다. 그래서 button 속성은 가지고 있지만 kangaroo속성은 가지고 있지 않다는걸 유추해낼 수 있다. 
window.onmousedown = function (mouseEvent) {
  console.log(mouseEvent.button);
  console.log(mouseEvent.kangaroo); //Property 'kangaroo' does not exist on type 'MouseEvent'.
};