void, 함수 할당가능성

00_8_3·2023년 4월 25일
0

typescript

목록 보기
5/8

1 void

js에서의 ts에서의 void는 차이가 있다.

js: 주로 연산자로 사용된다. 표현식 평가해서 undefined 반환한다.
ts: 함수의 반환 타입으로 사용된다.

2 함수의 할당가능성?

type voidFunc = () => void;
 
const f1: voidFunc = () => {
  return "str";
};

const a = f1();

console.log(a.length) // void에는 length가 없다고 에러 발생.

에러 발생 안한다 왜?
심지어 avoid타입으로 추론된다.

함수는 void 반환 타입 갖지만 원하는 다른 값(타입)을 자유롭게 반환 할수 있다.

하지만 어떠한 타입을 반환한다고 해도 void로 취급됩니다.
그래서 위 코드처럼 문자열 반환한다고 해도 문자열이 갖는 내장함수를 사용 할수 없다.

TS Docs 참고

1 forEach 함수 반환 타입 void

const arr = [1, 2, 3];
const el = [];
arr.forEach((a) => el.push(a) );

forEach 콜백함수 시그니처는 void를 반환하지만
(a) => el.push(a)가 들어가도 문제가 없다.
왜냐하면 map 처럼 반환값을 가져오지 않기 때문에 위의 "str".length 같은 문제가 발생하지 않기 때문이다.

컴파일 타임과 런타임 모두 문제가 없을 수 있지만
사용안하는게 좋을 듯? 위 처럼 void를 반환값인데 문자열을 반환한 경우
문자열만 사용가능한 내장함수를 사용해도 void 때문에 에러가 발생하기 때문에

2 literal function definition?

literal function definition가 함수 표현식만을 뜻하는 것이라 생각해서
TS Docs가 잘못되었는 줄 알았는데 아니었다.

리터럴 : 소스코드의 고정된 값을 나타내는 표기법.
보통 정수, 문자열, boolean 같은 값에 대한 표기법이다.

3 결론

함수 반환 타입을 명시적으로 void로 타입 지정해 놓은 경우
실제로 반환값이 타입을 가지면 안되지만

커스텀 타입을 사용한 함수 시그니처 타입에 void를 사용하는 경우
반환값이 어느 타입을 가져도 에러가 발생하지 않지만 그 반환값을 사용하려고 해서는 안된다.

그리고 만약 사용한다고 해도 해당 타입만이 사용할 수 있는 내부 메서드를 사용하는 경우 런타임에서 에러가 발생할 것이다.

참고

https://stackoverflow.com/questions/71645052/why-does-void-return-something

https://stackoverflow.com/questions/71645052/why-does-void-return-something

https://stackoverflow.com/questions/66946981/return-type-void-and-contextual-typing

0개의 댓글