Programming/JavaScript & TypeScript

타입 호환성(type Compatibility)

홍열 2022. 2. 16. 16:17
728x90

타입 호환성

하위타입에는 상위타입이 들어갈 수 없다.

//sub1은 sup타입의 서브타입니다.
let sub1:1 = 1;
let sup1:number = sub1;
//sub1 = sup1 //Type 'number' is not assignable to type '1'.

//sub2타입은 sup2의 서브타입니다. 
let sub2:number[] = [1]
let sup2:object = sub2
//sub2 = sup2 //error, 

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

class Animal {}
class Dog extends Animal {
    eat() {}
}

let sub6:Dog = new Dog();
let sup6:Animal = sub6
//sub6 = sup6 // 반대는 불가능...eat이 없다...

 

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

함수의 매계변수 타입만 같거나 슈퍼타입인 경우, 할당이 가능하다 

class Person{}
class Developer extends Person {}
class StartupDeveloper extends Developer {
burning()
}

//tellme 함수의 매계변수는 함수를 받는 구조 
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 에다가 StartupDeveloper => Developer을 할당하는 경우
// 옵션을 켜지 않으면 에러가 뜨지 않음..
//이건 에러!
//strictOptionTypes를 켜면 된다. 
//함수 할당시에 함수의 매개변수 타입이 같거나 슈퍼타입인 경우가 아닌 경우 에러
//d가 Developer의 하위 타입이라서 에러남
tellme(function sToD(d:StartupDeveloper):Developer {
    return new Developer
})