혼자 정리

[TS] (실수 정리) 파라미터의 타입만 서로 다른 함수의 유니온 본문

자바스크립트, 타입스크립트

[TS] (실수 정리) 파라미터의 타입만 서로 다른 함수의 유니온

tbonelee 2022. 9. 19. 17:39

다음 형태의 미리 정의된 함수 타입을 가지고 있었다.

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