서브 타입 (1)

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

let sup1: number = sub1;
sub1 = sup1; // error! Type 'number' is not assignable to type '1'.


// sub2 타입은 sup2 타입의 서브 타입이다.
let sub2: number[] = [1]; 
let sup2: object = sub2;
sub2 = sup2; // error! Type '{}' is missing the following properties from type 'number[]':
// length, pop, push, concat, and 16 more.


// sub3 타입은 sup3 타입의 서브 타입이다.
let sub3: [number, number] = [1, 2]; 
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.

서브 타입 (2)

// sub4 타입은 sup4 타입의 서브 타입이다.
let sub4: number = 1;
let sup4: any = sub4; 
sub4 = sup4;  // 예외적인 상황 기억해두자!


// sub5 타입은 sup5 타입의 서브 타입이다. 
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() {}
}


// sub6 타입은 sup6 타입의 서브 타입이다. 
let sub6: Dog = new Dog();
let sup6: Animal = sub6;
sub6 = sup6; // error! Property 'eat' is missing in type 'SubAnimal' but required in type 'SubDog'.

1. 같거나서브타입인경우, 할당이가능하다. => 공변

// primitive type
let sub7: string = '';
let sup7: string | number = sub7;


// object - 각각의 프로퍼티가 대응하는 프로퍼티와 같거나 서브타입이어야 한다. 
let sub8: { a: string; b: number } = { a: '', b: 1 };
let sup8: { a: string | number; b: number } = sub8;


// array - object 와 마찬가지
let sub9: Array<{ a: string; b: number }> = [{ a: '', b: 1 }]; 
let sup9: Array<{ a: string | number; b: number }> = sub8;

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

class Person {}
class Developer extends Person {
  coding() {}
}


class StartupDeveloper extends Developer { 
  burning() {}
}


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


// Developer => Developer 에다가 Developer => Developer 를 할당하는 경우
tellme(function dToD(d: Developer): Developer {
  return new Developer();
});


// Developer => Developer 에다가 Person => Developer 를 할당하는 경우
tellme(function pToD(d: Person): Developer {
  return new Developer();
});


// Developer => Developer 에다가 StartipDeveloper => Developer 를 할당하는 경우
tellme(function sToD(d: StartupDeveloper): Developer {
  return new Developer();
});

마지막은 논리적으로 문제가있음
하지만 타입스크립트는 융통성이있어서 따로 문제를 제기하지않음 하지만!

strictFunctionTypes 옵션을켜면

함수를할당할시에함수의매개변수타입이같거나슈퍼타입인경우가아닌경우
에러를통해경고한다

정리하자면 

위 코드에서 보면 tellme 함수는 // Developer => Developer 에다가 Developer => Developer 를 할당하는 경우 이렇게 명시를 해줬다 

하지만 마지막 코드에는 하위 타입인 StartupDeveloper 가 논리적으로 들어올 수 가 없다. 융통성이 있기에 에러를 출력하지 않지만 strictFunctionTypes 옵션을켜면 에러를 출력해준다.

'Type스크립트' 카테고리의 다른 글

타입 별칭(Type Alias)  (0) 2022.08.29
Structural Type System vs Nominal Type System  (0) 2022.08.29
Type System  (0) 2022.08.29
basic-types  (0) 2022.08.29
First Type Annotation  (0) 2022.08.28

+ Recent posts