TypeScript. 타입시스템

cm·2024년 1월 24일

타입스크립트

목록 보기
2/9

타입시스템

1. 타입시스템

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

1-1. 동작 방식

  • 코드를 읽고 모든 타입과 값을 이해 → 초기 선언의 타입 확인 → 값의 추후 사용 방법 확인 → 불일치 시 오류 표시.

    let firstNumber = 3;
    firstNumber.length; // Error: Type 'Number' has np call...
    // 1. 변수값이 3이므로 타입을 number로 판단
    // 2. number에서는 length가 사용불가하므로 오류

    위의 예시에서는 firstNumber의 타입이 number로 초기 지정되었으나 number 속성이 아닌 length 속성을 이용하므로 에러가 발생한다.

    let fistName = "kim";
    firstName = "Tom";
    firstName = true; //error

    할당가능성 : 타입에 맞게 값을 할당할 수 있는지 확인하는 것이다.
    위의 예시에서는 firstName의 타입이 string으로 초기 지정되었으므로 boolean타입인 true로 재할당하려고 하니 에러가 발생한다. 할당가능성을 확인했으나 불가하므로 에러가 발생한다.

  • 모든 타입과 값을 이해할 때 객체의 경우 속성별로 타입을 체크한다.
    let xUser = { id: number, password: string };
  • 오류 종류
    • 구문오류 : 타입스크립트가 코드로 이해할 수 있는 잘못된 구문을 감지할때 발생하는 오류. 타입스크립트→자바스크립트 변환하는 것을 차단한다.
    • 타입오류 : 타입검사기가 프로그램의 타입에서 오류를 감지할 때 발생하는 오류. 자바스크립트로 변환은 된다.

1-2. 타입 애너테이션(타입 주석)

  • 타입시스템에서 변수 선언문을 확장하여 타입을 명시하기 위해 사용하는 표기
  • 변수 뒤에 :를 이용하여 표기한다.
  • 자바스크립트와 마찬가지로 let을 사용하여 선언하는 경우 타입은 초기값이 지정되고 값은 타입과 일치하면 계속 변할 수 있지만, const을 사용하여 선언하는 경우 타입은 상수로 고정된다. (객체의 경우, 값은 타입과 일치하면 속성에 접근하여 변경할 수 있다.)
  let ch : string;
  ch= "123"
  ch = "asdf"

  const ch2 : string;
  ch2 = "123" // Cannot assign to 'ch2' because it is a constant.
  ch = "asdf"

  const ch3 : string = "kim"
  ch3 = "lee" // Cannot assign to 'ch3' because it is a constant.

  const ch4 = { name : 'j', age:3 }
  ch4.name = 'k' //ok
  ch4 = {name : 'l', age: 2} // Cannot assign to 'ch4' because it is a constant.

1-3. 타입 별칭

  • 자주 사용하는 타입에 별명을 붙이는 것 (타입시스템에만 존재하므로 런타임에서 코드 참조가 불가하다.)
  type personInfo = { id: number; name: string; age: number };
  const some = ({ id, name, age }: personInfo) => {};

id가 number, name이 string, age가 number인 personInfo를 타입으로 별칭한다.
함수 some에서 personInfo를 타입으로 하는 props 매개변수를 받는다.


2. 타입종류

  • 기본타입 : string, number, bigint, boolean, object, symbol, null, undefined

  • 조합타입 : 유니언, 리터럴, 교차타입

  • 확장타입 : any, void, never

    any
    모든 타입의 상위타입으로 어떠한 타입의 값도 할당할 수 있다. 변수선언시 초기값, 초기타입을 모두 지정하지 않으면 디폴트로 type이 any로 설정된다. 이러한 경우, any의 진화라는 타입이 계속 변화하는 상태가 발생할 수 있으니 주의해야한다.

    진화하는 any? 🔍

    let firstName;
    firstName = "Tom";
    firstName = true;
  • 구조화 타입: 배열, 튜플, 클래스, 인터페이스

    튜플과 배열
    선언시 튜플은 길이가 고정되어 있고 각 요소마다 다른 타입을 가지나, 배열은 길이가 비고정되어 있고 각 요소가 동일한 타입을 가진다.

    출처 : 신입생을 위한 Typescript 인터뷰 질문


3. StrictNullCheck (엄격한 Null 검사)

  • true로 지정할 시, null/undefined임을 명시해야 null/undefined임을 취급하는 것이다.
  • false로 지정할 시, null/undefined를 default로 취급한다.
// true
  let myVar: string;
  myVar = "Hello"; // 이 코드는 정상
  myVar = null;    // 오류: Type 'null' is not assignable to type 'string'

  //false
  let myVar: string;
  myVar = "Hello"; // 이 코드는 정상
  myVar = null;    // 이 코드는 정상, 에러 발생하지 않음
profile
나를 위한 기록

0개의 댓글