서브 타입
let sub1: 1 = 1;
let sup1: number = sub1; // ok
sub1 = sup1; // error!
let sub2:number[] = [1];
let sup2: object = sub2;
sub2 = sup2; // error!
let sub3: [number, number] = [1, 2]; // tuple
let sup3: number[] = sub3;
sub3 = sup3; // error!
let sub4: number = 1;
let sup4: any = sub4;
sub4 = sup4; // 가능하다. any 나뻐
let sub5: never = 0 as never;
let sup5: number = sub5;
sub5 = sup5; // error!
let sub6: Dog = new Dog();
let sup6: Animal = sub6;
sub6 = sup6; // error! eat missing
같거나 서브 타입인 경우, 할당이 가능하다. 이를 공변 이라고 한다.
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;
let sub9: Array<{ a: string; b: number }> = [{ a: '', b: 1 }];
let sup9: Array<{ a: string | number; b: number }> = sub9;
함수의 매개변수 타입만 같거나 슈퍼타입인 경우, 할당이 가능하다. 이를 반병이라고 한다.
class Person {}
class Developer extends Person {
coding() {}
}
class StartupDeveloper extends Developer {
burning() {}
}
function tellme(f: (d: Developer) => Developer) {}
tellme(function dToD(d: Developer): Developer {
return new Developer();
});
tellme(function pToD(d: Person): Developer {
return new Developer();
});
// tellme 함수에서 d: Developer 는 StartupDeveloper 의 burning() 을 가지지 않는다.
// 따라서 error 를 통해 경고한다. (StrictFunctionTypes 옵션)
tellme(function sToD(d: StartupDeveloper): Developer {
return new Developer();
});