| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Spring
- dockerd
- Born2beroot #42
- 42
- 네스트JS
- ecole42
- django #ninja #django-ninja #장고
- 42Seoul
- 데이터중심애플리케이션설계
- Daemon
- docker
- Spring-Boot
- nestjs
- pipex
- data-root
Archives
- Today
- Total
혼자 정리
[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 |