Study/TypeScript
[TS] 함수 반환 타입 (Function Return Types)
taecongs
2023. 10. 18. 11:01

알고있으면 좋은 Typescript Tip✨
함수 반환 타입 (Function Return Types)이란?
- 함수 반환 타입은 문자 그대로 함수가 리턴(반환)하는 값의 타입을 말한다.
- 함수 반환 타입과, 실제 함수의 결과값의 타입이 다를 때 타입스크립트는 에러를 발생시킨다.
function example(n1: number, n2: number): string {
return n1 + n2; // 에러 발생
}
(1) void 타입 정의
- 함수가 아무것도 반환하지 않을 때 사용한다. 즉, return 이 없을 때 사용한다.
- 아무것도 반환하지 않는 함수는 void 타입을 가지고, void 타입인 함수는 undefined를 리턴한다.
- VSCode에서 example 위에 마우스를 hover하면, 타입스크립트는 함수 example의 타입이 void라고 한다.
function example(num: number) {
console.log('Result: ' + num);
}
(2) void 타입과 undefined의 차이점은?
- undefined는 return 문이 있어야한다.
- void 키워드는 아무것도 반환하지 않기 때문에 return 문이 필요 없다.
// void 예제
function example1(num: number): void {
console.log('Result: ' + num); // 작동
}
// undefined 예제
function example2(num: number): undefined {
console.log('Result: ' + num); // 에러
}
// undefined를 지정해서 에러가 발생하지 않게 하려면 return 문 정의
function example2(num: number): undefined {
console.log('Result: ' + num); // 작동
return;
}
(3) never 타입 정의
- never 타입은 모든 타입에 할당 가능한 하위 타입이나, never타입에는 본인 외에 다른 타입이 할당될 수는 없다. 쉽게 말해, never 타입은 절대 발생할 수 없는 타입을 나타낸다.
- never 타입은 어디다 사용하는 걸까? 가장 흔한 예제로는 에러를 발생시킬 때 사용된다.
function fail(msg: string): never {
throw new Error(msg);
}
(4) any 타입 정의
- any 타입은 모든 타입을 할당받을 수 있는 타입이다. 하지만 모든 타입을 할당받는다는 의미는 의도치 않은 형 변환이나 다른 타입의 값이 대입되는 등 여러 사이드 이펙트를 발생시킬 수 있다는 의미이다. 그리고 해당 타입의 메서드를 사용할 때 "타입 표명(type-assertion)"을 사용해서 사용해야 하기 때문에 사용할 때 유의하여야 한다.
let str: any = 'anything';
str = 2;
str = [1, 2, 3];
(5) unknown 타입 정의
- unknown 타입은 any처럼 모든 타입을 넣어도 상관없다라기보다는 "이 변수는 어떤 타입이 될지 모르니 네가 추론해줘"라는 의미와 같다.
let str: unknown = 'anything';
str = 2;
str = [1, 2, 3];
(6) any 타입과 unknown 타입의 차이점은?
- any 타입은 다른 타입의 변수에도 할당이 가능하다. 반면에 unknown 타입의 경우 any 타입을 제외한 나머지 타입 변수에는 타입 표명을 하지 않는 이상 할당이 불가능하다. 그 외에도 unknown 타입의 변수에는 프로퍼티 접근도 못하고, 인스턴스 생성 역시 할 수 없다 항상 타입을 확인해야 하기 때문에 반면에 any타입은 굳이 타입 확인을 하지 않는다.
- any 타입과 unknown 타입은 되도록이면 사용을 권장하지 않는다.
// any 타입 변수 할당
let str: any = 'anything';
let test: string = str;
// unkown 타입 변수 할당
let str2: unknown = 'unknown';
//let test2: string = str2; // error : 'unknown' 형식은 'string' 형식에 할당할 수 없다.
let test2: string = (str2 as string);
str = str2;