타입 호환성
서브 타입
let sub1: 1 = 1;
let sup1: number = sub1;
sub1 = sup1;
let sub2: number[] = [1];
let sup2: object = sub2;
sub2 = sup2;
let sub3: [number, number] = [1,2];
let sup3: number[] = sub3;
sub3 = sup3;
서브 타입(2)
let sub4: number =1;
let sup4: any = sub4;
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;
같거나 서브타입인 경우, 할당이 가능하다 → 공변
let sub7:string ='';
let sup7: string | number = sub7;
let sub8:{a:string; b:number} = {a:'', b:1};
let sub8:{a:string|number; b:number} = sub8;
let sub9: Array<{a:string; b: number}> = [{a:'', b:1}];
let sup9: Array<{a:string| number; b: number}> = sub8;
함수의 매개변수 타입만 같거나 슈퍼타입 경우, 할당 가능하다 ⇒ 반병
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(function sToD(d:StartupDeveloper): Developer{
return new Developer();
})