타입스크립트 4

hojoon·2023년 3월 20일
0

타입스크립트

목록 보기
3/9

Structural Type System??

Nominal Type System??

Structural Type

  • 구조가 같으면, 같은 타입이다.
interface Iperson {
  name: string;
  age: number;
  speak(): string;
}

type personType = {
  name: string;
  age: number;
  speak(): string
}

두개는 구조가 같기 때문에 대입해서 쓸 수 있다. 그렇기 때문에 구조가 같다면 타입을 일일히 만들지 않아도 될듯!

nominal type system

  • 구조가 같아도 이름이 다르면, 다른 타입이다.
    (타입스크립트는 nominal 타입 시스템을 따르지 않기 때문에 이름이 다르더라도 구조가 같다면 같은 타입)

duck typing

  • 런타임에 발생하는 타입 시스템
  • 만약 어떤 새가 오리처럼 걷고, 헤엄치고, 꽥꽥거리는 소리를 낸다면 나는 그 새를 오리라고 부를 것이다.

타입 호환성

//sub1 타입은 sup1 타입의 서브 타입이다.
let sub1 : 1 = 1; 
let sup1: number = sub1 
sub1 = sup1 // 에러다 sup1의 타입이 더 크기 때문이다
let sub2 : number[] = [1];
let sup2 : object = sub2 
sub2 = sup2 // 에러다. sub2가 더 작기 때문에.
let sub3 : [number,number] = [1,2];
let sup3 : number[] = sub3;
sub3 = sup3;
let sub4 : number = 1;
let sup4 : any = sub4;
sub4 = sup4; //any라서 다 가능 ㅋㅋ
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; //에러다 
  1. 같거나 서브 타입인 경우 할당이 가능하다. => 공변이라고 부른다.
  2. 함수의 매개변수 타입만 같거나 슈퍼타입인 경우, 할당이 가능하다.
    => 반병이라고 부른다.

공변,반병 둘다 용어가 어렵지만 반병은 유일하게 함수의 매개변수를 할당할때만 쓰인다로 알아두자


Type Alias (타입 별칭, 별명)

  • interface 랑 비슷해 보인다.
  • primitive, union Type, Tuple, Function
  • 기타 직접 작성해야하는 타입을 다른 이름을 지정할 수 있다.
  • 만들어진 타입의 refer로 사용하는 것이지 타입을 만드는것은 아닙니다.
type MystringType = string;
const str = 'world';
let mystr: MystringType = 'hello'; //구조가 같으면 같은 타입이다.
mystr = str;

aliasing union type

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

type stringOrNumber = string | number ;

let another : stringOrNumber = 0;
another = 'Anna"
  • 유니온 타입은 a도 가능하고 b도 가능한 타입
  • 길게 쓰는걸 짧게 줄이려고 할때 !

Aliasing Tuple

let person: [string, number] = ['mark',35] ;
type personTuple = [string, number];
let another : personTuple = ['anna',24];

// 튜플 타입에 별칭을 줘서 여러군데서 사용할 수 있게 한다.

Aliasing Function

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

알리아스와 인터페이스를 어떻게 구분해서 사용할까??

  • 어떤 타입이 그 타입으로서 목적이나 존재가치가 명확하면 인터페이스를 사용한다.
  • 그렇지 않고 대상을 가르킬뿐이던가, 별명으로서만 존재한다면 알리아스를 사용하는편이다.

- 기술적으로도 물론 차이가 있지만 그것은 인터페이스 편에서 더 공부해보자

profile
프론트? 백? 초보 개발자의 기록 공간

0개의 댓글