typeScript - Type System

HunGeun·2022년 5월 2일
0

TypeScript

목록 보기
2/5

Type System

크게 2가지가 존재

  • 컴파일러에게 사용하는 타입을 명시적으로 지정하는 시스템
  • 컴파일러가 자동으로 타입을 추론하는 시스템
  • JS는 타입을 명시적으로 지정할 수 있고, 지정하지 않으면 컴파일러가 추론을 하게됨.

Option

  • 타입은 해당 변수가 할 수 있는 일을 결정함

noImplicitAny

타입 추론에 의해 'any'로 판단되면 컴파일 에러를 발생시키는 옵션
구현자가 any로 사용하고 싶다면 any라고 명시해주어야 함

function f1(a) {
  return a * 38;
}
console.log(f1(10));
console.log(f1('Mark') + 5); //NaN
//구현자가 NaN 나오도록 의도한 것 일때를 제외하면 잘못된 코드임
//즉 noImplicitAny 옵션을 켜면 이러한 상태에서 컴파일단계에서 에러를 알 수 있음

strictNullChecks

모든 타입에 자동으로 포함되어 있는 null과 undefined를 제거 해줌

function f2(a) {
  if (a > 0) {
  	return a * 38;
  }
}
//매개변수의 타입은 지정 했으나, return은 명시되어 있지 않아서 number로 추론됨

console.log(f2(-3) + 5); //NaN
//구현자에 의도라면 에러가 발생되어야 하지만 number타입안에 기본적으로 undefined가 내장되어 있어서 NaN이 return 됨. 
// 이러한 현상을 막고자 strictNullChecks 옵션을 사용

noImplicitReturns

함수 내에서 모든 코드가 값을 리턴하지 않으면, 에러발생
예를 들어, if문 사용시 if에만 return값을 지정하고 else에는 지정하지 않으면 에러발생

function f3(a: number) {
  if (a>0) {
    return a * 39;
  }
}

structural vs nominal type system

structural type system

  • 구조가 같으면, 같은 타입
  • TS, JS

nominal type system

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

duck typing

  • 만약 어떤 새가 오리처럼 걷고, 헤엄치고, 꽥꽥거리는 소리를 낸다면 나는 그 새를 오리라고 부를 것이다
  • python

type Compatibility

sub type

  • 같거나 서브 타입인 경우 : 할당 가능 (공변)
let sub1: 1 = 1; //1 type
let sup1: number = sub1; //number type
sub1 = sup1; // error! Type 'number' is not assignable to type '1'.

//object > array
let sub2: number[] = [1]; //array
let sup2: object = sub2; //object 
sub2 = sup2; // error! Type '{}' is missing the following properties from type 'number[]': length, pop, push, concat, and 16 more.

//array > tuple
let sub3: [number, number] = [1, 2]; //tuple
let sup3: number[] = sub3;
sub3 = sup3; // error! Type 'number[]' is not assignable to type '[number, number]'. Target requires 2 element(s) but source may have fewer.

// number , any
let sub4: number = 1;
let sup4: any = sub4;
sub4 = sup4;

// number > never 
let sub5: never = 0 as never;
let sup5: number = sub5;
sub5 = sup5; // error! Type 'number' is not assignable to type 'never'.

//
class Animal {}
class Dog extends Animal {
	eat() {} 
}
let sub6: Dog = new Dog();
let sup6: Animal = sub6;
sub6 = sup6; // error! Property 'eat' is missing in type 'SubAnimal' but required in type
  • 함수의 매개변수 타입만 같거나 슈퍼타입인 경우 : 할당 가능 (반병)
class Person {}
class Developer extends Person {
coding() {} }
class StartupDeveloper extends Developer {
  burning() {}
}

function tellme(f: (d: Developer) => Developer) {}

// Developer => Developer Developer => Developer
// okay
tellme(function dToD(d: Developer): Developer {
  return new Developer();
});

// Developer => Developer Person => Developer
// okay
tellme(function pToD(d: Person): Developer {
  return new Developer();
});

// Developer => Developer StartipDeveloper => Developer
// okay
// strictFunctionTypes를 켜면 에러 발생
tellme(function sToD(d: StartupDeveloper): Developer {
  return new Developer();
});

Type Alias

  • Interface 와 비슷해 보임
  • 만들어진 type에 이름을 붙혀주는 느낌 (타입을 만드는것은 아님)

Aliasing Primitive type

type MyStringType = string;

const str = 'world';

let myStr: MyStringType = 'hello';

myStr = str;
str = myStr;
// 구조가 같으면 같은 타입..

Aliasing Union type

let person: string | number = 0;
person = 'Mark';

type StringOrNumber = string | number;

let another: StringOrNumber = 0;
another = 'Anna';

Aliasing Tuple type

let person: [string, number] = ['Mark', 35];

type PersonTuple = [string, number];

let another: PersonTuple = ['Anna', 24];

Aliasing Funtion

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

0개의 댓글