[TS] 타입시스템 (Type Checker)

타입시스템이란?

프로그래밍 언어가 프로그램에서 가질 수 있는 타입을 이해하는 방법에 대한 규칙 집합이다.

 

타입시스템이 코드를 이해하는 법

  1. 코드를 읽고 존재하는 모든 타입과 값을 이해한다.
  2. 각 값이 초기 선언에서 가질 수 있는 타입을 확인한다.
  3. 각 값이 추후 코드에서 어떻게 사용될 수 있는지 그 모든 방법을 확인한다. (추론, 할당 가능성)
  4. 값의 사용법이 타입과 일치하지 않으면 사용자에게 오류를 표시한다.

 

타입 추론과정

let firstName = "Tom";
firstName.length();

// Error : This expression is not callable.
//Type 'Number' has no call signatures.

 

  1. 코드를 읽고 firstName이라는 변수 이해한다. (Tokeninze/Scan)
  2. 초깃값이 "Tom"이므로 firstName은 string 타입이라고 결론 짓는다. (추론)
  3. firstName의 .length멤버를 함수처럼 호출하는 코드 확인한다.
  4. string의 .length 멤버는 함수가 아닌 숫자라는 오류를 표시한다.

 

오류의 종류

구문 오류

타입스크립트가 자바스크립트로 변환되는 것을 차단한 경우이다.

타입스크립트가 코드로 이해할 수 없는 잘못된 구문을 감지할 때 발생한다.

let let wat;

//Error : ',' expected.
->예기치 않은 let에 대한 구문 오류 발생
//타입스크립트 컴파일러 버전에 따라
//컴파일된 자바스크립트 결과

let let, wat;

 

타입 오류

타입 검사기에 따라 일치하지 않는 것이 감지된 경우이다.

타입스크립트의 타입 검사기가 프로그램의 타입에서 오류를 감지했을때 발생한다.

console.bulb("No Pain, No Gain!!");

//Error : Property 'bulb' does not exist on type 'Console'.

 

구문상 유효하지만 코드가 실행될 때 충돌할 가능성을 감지한다.

-> 실행전에 타입오류를 확인하고 발견된 문제를 해결하는 것이 좋다.

 

할당가능성

타입스크립트에서 함수 호출이나 변수에 값을 제공할 수 있는지 여부를 확인 하는 것이다.

어떤 타입의 변수에 다른 타입의 값을 할당하려고 할때

일반적으로 'Type…is not assignable to type…'형태의 오류를 만난다.

 

Type Annotation

진화하는 any

초기 타입을 유추할 수 없는 변수를 진화하는 any라고 부른다.

any 타입을 사용해 타입이 진화하는 것을 허용하게 되면 타입스크립트의 타입 검사 목적을 부분적으로 쓸모없게 만든다.

any 타입을 가진 값에는 타입스크립트의 타입 검사 기능을 잘 적용할 수 없다!

type annotation은 초기값을 할당하지 않고도 변수의 타입을 선언할 수 있는 구문이다

타입 애너테이션은 변수 이름 뒤에 배치되며, 콜론(:)과 타입 이름을 차례대로 기재된다.

타입 애너테이션은 타입스크립트에만 존재하고, 런타임 코드에 영향 주지 않는다. 유효한 자바스크립트 구문도 아니다.

-> 'Type…is not assignable to type…'형태의 오류는 

타입스크립트에서 만나게 되는 가장 일반적인 오류 중 하나이다.

 

해당 오류메세지에서 언급된 첫번째 type은 코드에서 변수에 할당하려고 시도하는 값이며,

두번째 type은 첫번째 타입, 즉 값이 할당되는 변수

type t = string //alias

let firstName : string //type annotation

 

js에서는 값이 할당되지 않으면 undefined를 참조하지만 ts는 미리 타입(undefined를)으로 설정해야 참조 가능하다.

undefined를 설정하지 않고 변수를 사용하면, undefined의 가능성을 미리 알리지 않았기 때문에 에러가 발생한다.

 

불필요한 타입 애너테이션

초깃값이 있는 변수에 타입 애너테이션을 추가할 필요가 없다.

 

'Dev > Typescript' 카테고리의 다른 글

[TS] 인터페이스  (0) 2025.04.22
[TS] 배열과 튜플  (0) 2025.04.22
[TS] 함수타입  (1) 2025.04.22
[TS] 객체타입  (1) 2025.04.21
[TS] 유니언과 리터럴  (0) 2025.04.21