void는 어떤 값을 가지지 않는 것을 의미하며 return하지 않는 함수의 return 값 type으로 설정 가능하다. void는 결과 값을 반환하지 않는 함수에 설정하므로 undefined와 같다. 명시적으로 반환 값을 설정하지 않은 함수는 undefined를 반환하기에 typescript에서는 void를 명시한다.
function a () {
}
const b = a()
function a ():void {
return '3';
}
interface Human {
talk: () => void;
}
const human: Human = {
talk() {}
}
const human: Human = {
talk() {return 'abc'}
}
------------1
function a(): void {
}
------------2
interface Human {
talk: () => void;
} // 메서드로 선언한 void
// ex)
interface Human {
talk: () => void;
}
// 얘도 메서드잖아 하지만 이렇게 return값이 존재할 수 있음.
const human: Human = {
talk() {return 'aba'}
}
------------3
function a(callback:() => void): void {
} //매개변수로 선언한 void
// ex)
a(() => {
return '3';
})// 이렇게! 이게 콜백인데 이것도 void인데 return값이 존재할 수 있지.
그래서 void는 함수의 return 값이 void인 경우에만 return에 값이 있으면 에러가 나고 매개변수와 메서드 이 둘은 상관 없다. 이 두 가지는 왜 error가 안 나냐면, 애네한테서의 void의 의미는, 이 함수 또는 이 메서드의 return값을 사용하지 않겠다 그런 의미이다. ('사용하지 않겠다의 의미')
그리고 return값의 타입을 void로 명시한 경우는 직접적으로 return값이 없다는 의미이다.
그래서 같은 void이지만 의미가 다르다고 보면 된다.
void는 반환 값이 없는 함수의 타입을 나타내고, undefined는 값이 할당되지 않은 변수의 타입이나 함수에서 명시적으로 undefined를 반환하는 경우의 타입을 나타냅니다.
let target: number[] =[];
function forEach(arr: number[], callback: (el: number) => undefined): void;
//여기서 undefined면
forEach([1,2,3], el => target.push(el)); // target.push에서 에러가 날 수 밖에 없다.
interface A {
talk: () => void;
}
const a:A = {
talk() {return 3;}
}
const b = a.talk(); // 얘 타입 void 나옴.
💡그래서 위와같은 경우에는 const b = a.talk() as number; 이런식으로 타입을 강제로 만들어줄 수 있는데, 그렇다고 항상 강제로 바꿔줄 수 있는 건 아니다. 왜냐, 이렇게 에러가 뜨기 때문. (void 형식을 number 형식으로 변환한 작업은 실수일 수 있습니다. 두 형식이 서로 충분히 겹치지 않기 때문입니다. 의도적으로 변환한 경우에는 먼저 'unknown'으로 식을 변환합니다.)
그렇기 때문에 내가 진짜 책임질 수 있다 하는 경우에만 const b = a.talk() as unknown as number 이렇게 바꿔줄 수 있다.
또 강제로 바꾸는 방법이 하나 더 있다.
const b = <number><unknown>a.talk();
하지만 이 방식보다는 as를 더 권장한다 그 이유는,
react에 jsx에서 <>이런 태그들이 사용이 되는데
<div></div>
이렇게, 그래서 이게 헷갈려서 타입스크립트가 잘 이해를 못 한다. 그렇기 때문에 react를 쓰게 될 경우 강제 타입 변환시에 as unknown as 형식으로 쓰는 게 더 좋다.
마지막으로 혹시
const b: number = a.talk()
이렇게 타입을 강제해 줄 수도 있지 않을까 생각 할 수 있겠지만 "void 형식은 number 형식에 할당할 수 없다."라고 에러 뜨기 때문에 불가하다.