혼자 정리
[TS] (실수 정리) 파라미터의 타입만 서로 다른 함수의 유니온 본문
다음 형태의 미리 정의된 함수 타입을 가지고 있었다.
type FunctionA = (keys: string[]) => void;
type FunctionB = (mutator: (prevKeys: string[]) => string[]) => void;
두 함수 타입에서 받을 수 있는 파라미터를 모두 허용하는 함수 타입을 만들고자 했다.
사실 다음처럼 하면 되기는 한다.
type FunctionAll = (param: string[] | (mutator: (prevKeys: string[]) => string[])) => void;
그렇지만 이미 정의된 타입을 사용하려 해서 다음과 같이 정의해보았다.
type FunctionAll = FunctionA | FunctionB;
그 후 (mutator: (prevKeys: string[]) => string[])) => void
타입의 함수를 인자로 넘기려 했더니 다음과 유사한 오류가 떴다.
TS2345: Argument of type '(prevKeys: string[]) => string[]' is not assignable to parameter of type 'string[]'.
함수를 유니언하는 것과 함수의 파라미터 타입을 유니온하는 것을 착각한 것이다.
해당 방식으로 코드를 작성하면 컴파일러는 FunctionAll
타입은 '스트링 배열만 인자로 받을 수 있는 함수'이거나, '(스트링 배열을 인자로 받아 스트링 배열을 반환하는 함수)만 인자로 받을 수 있는 함수'일 것이라고 생각한다.
즉, 두 파라미터를 전부 받을 수 있는 함수가 아닌 것이다.
그렇기 때문에 유니언을 사용하지 않고 인터섹션을 사용해야 한다.
함수 타입의 인터섹션과 관련한 스펙은 다음 문서 참조
https://github.com/microsoft/TypeScript/blob/196c0aa0783ddd7520f9accd54d53c3223f5a47c/doc/spec.md#3.5
'자바스크립트, 타입스크립트' 카테고리의 다른 글
Node.js의 CommonJS, ESM 모듈 호환성 (0) | 2024.04.01 |
---|---|
[TS] 'satisfies' 오퍼레이터 (0) | 2024.01.09 |
[NestJS] 필터에서 다른 필터로 예외 전달하기 (0) | 2022.09.30 |
blur 이벤트 발생지가 window내부인지 외부인지 구분하기 (0) | 2022.06.13 |
[JS]Execution Context 기본 개념 (0) | 2021.10.30 |