일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- react
- 웹디자인기능사
- 슬라이드전환
- git
- 깃
- Supabase
- jQuery
- 비전공자
- 자바스크립트
- PROJECT
- 프론트엔드
- JS
- 실기
- 렛츠기릿자바스크립트
- 웹퍼블리셔
- 타입스크립트
- 리액트
- web
- 웹디자인기능사실기
- CSS
- HTML
- 웹디실기
- 코딩독학
- 정보처리기사
- 코드공유
- JavaScript
- 세로메뉴바
- github
- 연산자
- 생활코딩
- Today
- Total
코딩하는라민
[TypeScript] 함수의 기타 반환타입(unknown, void, never) 본문
[TypeScript] 함수의 기타 반환타입(unknown, void, never)
📌 unknown
타입스크립트에서 unknown은 JavaScript의 any 타입과 유사한 타입이다. unknown 타입은 컴파일러에게 해당 값에 대한 타입 정보가 없음을 알리는 역할을 한다.
unknown 타입은 어떤 값이 들어올지 알 수 없는 경우에 사용된다.
즉, 변수나 매개변수에 할당되는 값의 타입을 정확히 알 수 없을 때 사용하는 것이다.
unknown 타입을 가지는 변수나 매개변수는 어떤 타입의 값도 가질 수 있다.
하지만 unknown 타입의 값으로는 직접적인 조작이 불가능하고, 다른 타입으로 할당하기 전에 적절한 타입 검사나 타입 단언(type assertion)을 통해 원하는 타입으로 형 변환을 해줘야 한다.
let userInput: unknown;
userInput = 5;
userInput = 'Ramin';
// 🏷️사용하기 전에 타입 검사나 타입 단언이 필요
// 타입 검사
if (typeof userInput === 'string') {
console.log(userInput.toUpperCase());
}
// 타입 단언을 통해 string으로 형 변환
let userName: string = userInput as string;
// 또는
// 다른 형태의 타입 단언 문법
let userName: string = <string>userInput;
unknown은 더욱 타입 안정성과 타입 체크를 강화하기 위해 도입된 개념으로 any 타입보다는 unknown 타입을 사용하는 것이 권장된다.
unknown 타입은 타입 안전성을 유지하면서 동적인 값을 다루는 상황에서 유용하게 사용할 수 있다.
📌 void
일부 함수는 어떤 값도 반환하지 않을 수도 있다. 함수 타입을 선언할 때 void 를 사용하면 함수에서 반환되는 모든 값은 무시된다. 즉, 반환 타입이 void 인 함수는 값을 반환하지 않을 수 있다.
let todos: (todo: string) => void;
todos = (todo) => {
console.log(`${todo}`);
};
todos("러닝 타입스크립트"); // Ok
✏️ void 는 undefined 와 다르다.
자바스크립트 함수는 실젯값이 반환되지 않으면 기본으로 모두 undefined 를 반환한다. 하지만 void는 undefined 와 동일하지 않다.
function returnVoid() {
return
} // void 타입
let lazyValue: stirng | undefined;
lazyValue = returnsVoid();
// Error: Type 'void' is not assignable to type 'string | undefined'.
const records: string[] = [];
function saveRecords(newRecords: string[]) {
newRecords.forEach(record => records.push(record));
}
saveRecords(['29', 'youtube', 'netflix']);
위의 코드에서 saveRecords 함수의 반환값이 명시적으로 선언되어 있지 않다. 따라서 TypeScript에서는 함수의 반환값이 기본적으로 void로 간주된다.
- 일반적으로 함수의 반환 타입이 명시되지 않은 경우, TypeScript는 암묵적으로 반환 타입을 any로 간주한다. 따라서 함수가 return 문을 사용하여 값을 반환하더라도 오류가 발생하지 않는다.
- 반환 타입이 명시적으로 선언되지 않고 함수 내에서 return 문이 없는 경우, TypeScript는 해당 함수의 반환 타입을 void로 추론합니다.
✏️ 어떤 값도 할당할 수 없다.
타입스크립트에서 void는 "아무 값도 반환하지 않는다"는 의미를 가지는 타입이다.
함수의 반환 타입으로 주로 사용되며, 해당 함수가 값을 반환하지 않는다는 것을 명시적으로 나타낸다.
때문에 void 타입의 변수에 값을 할당하려고 시도하면 타입 에러가 발생한다.
function sayHello(): void {
console.log("Hello!");
}
const result: void = sayHello(); // Error 🔥
string 타입의 값을 void 타입으로 할당하거나 void 타입의 값을 string 타입에 할당한다면 타입 불일치로 에러를 발생시킨다.
function sayHello(): string {
console.log("Hello!");
}
const result: void = sayHello(); // Error 🔥
📌 never
타입스크립트에서 never 타입은 "결코 발생하지 않는 값"을 나타내는 타입이다. 즉, 이 타입으로 선언된 변수에는 어떤 값도 할당할 수 없다.
- 함수의 반환 타입 : 함수가 항상 예외를 발생시키거나, 끝나지 않는 무한 루프를 실행하는 경우에 never 타입을 반환 타입으로 지정할 수 있다.
- 변수의 값 : never 타입은 어떤 값도 할당할 수 없는 변수의 타입으로 사용된다.
간단히 말해, never 타입은 "여기에 값이 올 수 없다"라는 의미를 가지며, 비정상적인 상황을 표현하는 데 사용
✏️ 함수의 반환 타입
함수가 항상 예외를 throw 하거나 절대로 반환하지 않는 경우 never 타입을 반환 타입으로 지정할 수 있다.
이는 함수가 호출될 때 예외가 발생하거나 무한 루프에 빠져 끝나지 않을 것임을 나타냄.
function throwError(message: string): never {
throw new Error(message);
}
✏️ 변수의 값
never 타입은 변수에 할당될 수 없는 값을 나타내는데 사용될 수 있다.
let neverVariable: never;
// 가능한 값이 없기 때문에 오류가 발생합니다.
neverVariable = 5;
✏️ never 타입에는 never 타입만 할당 가능
let home: never = true; // Error 🔥: boolean 타입은 never에 할당할 수 없다.
// Ok
let out: never = (() => {
throw new Error(Throw Error');
})();
✏️ void 와 다르다.
void 와 never 모두 반환 값이 없음을 타나내는 타입이다.
하지만 두 타입은 사용되는 맥락과 의미적인 차이가 있다. 두 타입의 주요 차이점은 반환의 가능성이다.
1️⃣ void
void는 함수가 반환하는 값이 없음을 명시적으로 나타낸다. 즉, 함수가 실행되고 작업을 수행한 후에 아무런 값을 돌려주지 않는다.
2️⃣ never
never는 함수가 절대 반환하지 않는다는 것을 의미. 함수가 항상 예외를 발생시키거나 끝나지 않는 무한 루프를 실행하는 경우에 never 타입을 반환 타입으로 지정한다.
void 는 반환 값을 갖지 않음을 나타내지만, 함수의 실행 흐름은 정상적으로 종료된다. 하지만 never 타입은 함수가 반환하는것이 아니라 예외를 발생시키거나 끝나지 않는 무한 루프를 실행하여 실행 흐름이 중단된다.
따라서 never 타입은 특별한 상황에 사용되는 타입이며, 대부분의 함수에서는 다른 반환 타입을 선택하는 것이 적절하다.
⭐ 참고할 글
참고 : 러닝 타입스크립트를 읽고, chat GPT 의 도움을 받아 학습한 내용을 간단하게 정리한 내용입니다.
잘못된 부분이나 문제되는 점이 있으면 댓글 부탁드립니다.
'Core > TypeScript' 카테고리의 다른 글
[TypeScript] 함수의 반환 타입과 함수 타입 구문(function type) (1) | 2023.06.02 |
---|---|
[TypeScript] 함수의 매개변수(선택적 매개변수, 기본 매개변수, 나머지 매개변수) (0) | 2023.06.02 |
[TypeScript] 객체 타입 유니언(|)과 교차 타입(intersection type, &) (0) | 2023.05.31 |
[TypeScript] 객체의 선택적 속성(Optional Properties, 옵셔널 프로퍼티) (3) | 2023.05.30 |
[TypeScript] 초과 속성 검사 (Excess Property Checks) (5) | 2023.05.30 |