[메가바이트 스쿨] FE 3기 온라인 - TS - Type System

seokji·2022년 10월 21일
1

메가바이트 FE 3기

목록 보기
15/15
post-thumbnail

Type System


1. 작성자와 사용자의 관점으로 코드 바라보기

타입 시스템

  • 명시적으로 지정하는 시스템
  • 자동으로 타입을 추론하는 시스템

타입스크립트의 타입 시스템

  • 명시적 지정
  • 타입스크립트 컴파일러가 추론

타입이란 해당 변수가 할 수 있는 일을 결정한다.

  • noImplicitAny
    • 암시적 any 타입을 피하기 위한 옵션
  • strictNullChecks
    • 엄격한 타입 체크를 위한 옵션
    • 모든 타입의 서브 타입인 null, undefined 제거

명시적으로 리턴 타입을 지정하는 게 좋다.

  • noImplicitReturns
    • 함수 내에서 모든 코드가 값을 리턴하지 않으면, 컴파일 에러를 발생

✨ 작성자가 사용자에게 코드를 문제없이 실행시킬 수 있게 하는 것이 중요


2. Structural Type System vs Nominal Type System

Structural Type System

구조가 같으면, 같은 타입

  • TypeScript

Nominal Type System

구조가 같아도 이름이 다르면, 다른 타입

  • C

duck typing

새가 오리처럼 걷고, 헤엄치고, 꽥꽥거리는 소리를 낸다면 -> 그 새를 오리라고 부를 것이다. 런타임에 타입을 결정

  • Python

3. Type Compatibility (타입 호환성)

서브 타입은 슈퍼 타입에 할당이 가능하다.

  1. 같거나 서브 타입인 경우, 할당이 가능하다 -> 공변 (기본적으로 공변)

  2. 함수의 매개 변수 타입만 같거나 슈퍼 타입인 경우, 할당이 가능하다. -> 반병

    • strictFunctionTypes 옵션을 키면 -> 매개 변수 타입이 같거나 슈퍼 타입인 경우가 아닐 때 에러 발생

4. Type Alias (타입 별칭)

  • Interface와 비슷
  • Primitive, Union, Tuple, Function -> 다른 이름으로
  • 만들어진 타입의 refer 로 사용하는 것, 타입을 만드는 것은 x
// string
type MyStringType = string;

const str = "Hello";

let myStr: MyStringType = "world";
myStr = str;

// union
// a 도 가능하고 b 도 가능한 타입
// 길게 쓰는걸 짧게
let person: string | number = 0;

type StringOrNumber = string | number;

let another: StringOrNumber = 123;
another = "JI";

// tuple
// 여러군데서 사용 가능
let person: [string, number] = ["Ji", 10];

type personTuple = [string, number];

let another: personTuple = ["Seok", 5];

// function
type EatType = (food: string) => void;

alias interface 차이

interface

  • 타입의 목적, 존재가치가 명확할 때

alias

  • 단순히 지칭하거나 별명

✨ 자신의 기준을 세우는 것이 중요

1개의 댓글

comment-user-thumbnail
2022년 10월 24일

지석님 오늘도 깔끔 명료한 포스팅 잘 보고 갑니다🙏

답글 달기