js에서의 ts에서의 void는 차이가 있다.
js: 주로 연산자로 사용된다. 표현식 평가해서 undefined
반환한다.
ts: 함수의 반환 타입으로 사용된다.
type voidFunc = () => void;
const f1: voidFunc = () => {
return "str";
};
const a = f1();
console.log(a.length) // void에는 length가 없다고 에러 발생.
에러 발생 안한다 왜?
심지어 a
는 void
타입으로 추론된다.
함수는 void 반환 타입 갖지만 원하는 다른 값(타입)을 자유롭게 반환 할수 있다.
하지만 어떠한 타입을 반환한다고 해도 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 때문에 에러가 발생하기 때문에
literal function definition
가 함수 표현식만을 뜻하는 것이라 생각해서
TS Docs가 잘못되었는 줄 알았는데 아니었다.
리터럴 : 소스코드의 고정된 값을 나타내는 표기법.
보통 정수, 문자열, boolean 같은 값에 대한 표기법이다.
함수 반환 타입을 명시적으로 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