공변성과 반공변성이란
-
공변성
- 함수 리턴값, 일반 변수 등의 타입.
- 좁은 타입으로 선언한 변수에 넓은 타입으로 선언한 변수 할당 가능
// 1. 좁 ~> 넓 const a: {name: string} = {name: 'yesme'}; ⬇️ {name: string, age: number} 넣어보기 ⬇️ const a: {name: string} = {name: "yesme", age: 365}; // 2. 넓 ~> 좁 const a: {name: string} = {name: "yesme", age: 365}; ⬇️ {name: string, age: number} 넣어보기 ⬇️ error! age 값이 없음
-
반공변성
- 함수의 매개변수, 제네릭으로 선언된 함수.
- 넓은 타입으로 선언한 변수에 좁은 타입 변수 할당 가능
// 인자로 {name}을 받아, 계산 후 무언가를 반환 type NameFun = (value: {name: string}) => unknown; // name과 age를 인자로 받는 함수 function userInfo(value: {name: string; age: number}){ return value; } // 이 함수는 NameFun 타입으로 정의할 수 있나? // => 불가능. // 내가 선언한 함수(nameInfo - 좁은 타입) 인자에 필요한 age 값이 userInfo(넓은 타입)에는 없음 const nameInfo: NameFun = userInfo; // ERROR!
-
이변성
- A -> B 일 때
T<A>
->T<B>
도 되고T<B>
->T<A>
도 되는 경우
- A -> B 일 때
참고 블로그 : https://velog.io/@hwangyena/우아한타입스크립트-공변성과-반공변성-완전-이해하기 (opens in a new tab)