[효리] **공통 콜백 함수**를 위한 타입 선언을 제공하는 것이 좋다? 예시가 없으니 잘 이해가 안된다.
[재희] 공통 콜백 함수? 그냥 매개변수의 타입과 리턴 타입이 공통된 콜백 함수를 얘기하는 것 같다.
[효리] 아하. 뭔가 다른 개념이 있는 줄 알았다.
[지윤] “프로젝트 내부적으로 사용되는 **타입에 선언 병합이 발생하는 것은 잘못된 설계**이다.” 이 부분이 조금 헷갈린다. 인터페이스만 선언 병합이 되는 게 아니었나? 타입(타입 별칭)에서도 일어난다는 뜻인가?
[효리] 타입(타입 별칭)이 아니고 타입 자체를 말하는 것 같다.
[재희] 인터페이스를 한 프로젝트 내에서 보강을 할 일이 뭐가 있을까? ES5 → ES2015 버전으로 업데이트하는 예시를 책에서 들어줬는데, 우리 같은 경우는 회사에서 기존 프로젝트의 레거시를 새 버전으로 업데이트할 때 등을 예시로 들 수 있을 것 같다. 기존 타입 선언을 보강해서 사용할 수 있을 것 같다.
<aside>
😒 [동호] 레거시가 타입 별칭으로 선언되어 있으면 어떡하죠…
[재희] 그럼 뭐.. 인터페이스로 새로 작성해야죠.
[동호] 그렇습니다. [재희] 그렇습니다.
</aside>
type Pick<T, K> = { [k in K]: T[K] } // 'K' 타입은 'string | number | symbol' 타입에 할당할 수 없습니다.
// k는 T 타입과 무관하고 범위가 너무 넓다.
// K는 인덱스로써 사용이 가능한 string | number | symbol 타입이 되어야 한다.
// 실제로는 K는 T의 키의 부분 집합이 되어야 한다.
type Pick<T, K extends keyof T> = { [k in K]: T[K] }
[지윤] ‘K’ 타입은 string, number, symbol 저 부분. 원래 number도 들어가나?
[재희] 그렇다. 객체의 키로 될 수 있는 것들 string, number, symbol 이 있다.