[Worksheet 220429] Type System

방예서·2022년 5월 1일
0

Worksheet

목록 보기
22/47
TypeScript Essentials

Type System

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

타입 시스템

컴파일러에게 사용하는 타입을 명시저긍로 지정하는 시스템
컴파일러가 자동으로 타입을 추론하는 시스템

TS의 타입 시스템

타입을 명시적으로 지정할 수 있다.
그렇지 않으면, 타입스크립트 컴파일러가 자동으로 타입을 추론한다.

noImplicitAny

타입을 명시적으로 지정하지 않은 경우, 타입스크립트가 추론 중 'any'라고 판단하게 되면 컴파일 에러를 발생시켜 명시적으로 지정하도록 유도한다.

strictNullChecks

모든 타입에 자동으로 포함되어 있는 'null'과 'undefined'를 제거한다.

noImplicitReturns

함수 내에 모든 코드가 값을 리턴하지 않으면, 컴파일 에러를 발생시킨다.
모든 코드에서 리턴을 직접 해야한다.

Structural VS Nominal

Structural Type System

구조가 같으면 같은 타입이다.

Nominal Type System

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

duck typing

어떤 새가 오리처럼 걷고 소리를 내면 나는 그 새를 오리라고 부를 것이다.
(python)

타입 호환성

서브 타입

let sub1: 1 = 1;
let sup1: number = sub1;
//sub1 타입은 sup1 타입의 서브 타입이다.

sub1 = sup1; //안됨

let sub2: number[] = [1];
let sup2: object = sub2;
//sub2 타입은 sup2 타입의 서브 타입이다.

let sub3: [number, number] = [1,2];
let sup3: number[] = sub3;
//sub3 타입은 sup3 타입의 서브 타입이다.

let sub4: number = 1;
let sup4: any = sub4;
//sub4 타입은 sup4 타입의 서브 타입이다.
sub4 = sup4; //에러는 안남

let sub5: never = 0 as never;
let sup5: number = sub5;
sub5 = sup5 // 얘는 에러


class Animal {}
class Dog extends Animal {
  eat() {}
}

let sub6: Dog = new Dog();
let sup6: Animal = sub6;
sub6 = sup6; //에러
  • 같거나 서브 타입인 경우, 할당이 가능하다. (공변)

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

타입 별칭(type aliasing)

primitive, union, type, function을 다른 이름으로 짓거나,
기타 직접 작성해야하는 타입을 다른 이름으로 지정할 수 있다.
만들어진 타입의 refer로 사용하는 거고 타입을 만드는 것은 아니다.


//프리미티브 타입
type MyStringType = string;

//유니온 타입
type StringOrNumber = string | number;
let another: StringOrNumber 0;

//튜플 타입
type PersonTupe = [string, number];
let another: PersonTuple = ['a', 22];

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

* interface와는 다르니 잘 구분해서 쓸 것.

profile
console.log('bang log');

0개의 댓글