타입스크립트 never 타입 예제

타입스크립트에는 never 키워드를 볼 수 있다.

never 타입은 void와 비슷하게 반환값이 없다는 의미도 있지만, 실제로 값이 없거나, 코드가 정상적으로 동작하지 않는 상황을 표현하는 타입이다.

문장으로는 의미가 와닿지 않는다.

쉽게 생각해서 발생할 수 없는 모든 상황, 절대로 값이 존재하지 않는 상태로 우선 외우고 넘어가자.

let result: never;

result = "hello";
// 오류: Type 'string' is not assignable to type 'never'.

result = 10;
// 오류: Type 'number' is not assignable to type 'never'.

-

function throwError(message: string): never {
  throw new Error(message);
}

-

function getUserName(name?: string): string {
  if (!name) {
    throwError("사용자 이름이 없습니다.");
  }

  return name.toUpperCase();
}

-

function runForever(): never {
  while (true) {
    console.log("실행 중");
  }
}

-

function formatValue(value: string | number): string {
  if (typeof value === "string") {
    return value.toUpperCase();
  }

  if (typeof value === "number") {
    return value.toFixed(2);
  }

  const unreachable: never = value;
  return unreachable;
}

-

type PaymentStatus =
  | { type: "ready"; amount: number }
  | { type: "paid"; receiptId: string }
  | { type: "failed"; reason: string };

-

function getPaymentMessage(status: PaymentStatus): string {
  switch (status.type) {
    case "ready":
      return `결제 예정 금액은 ${status.amount}원입니다.`;

    case "paid":
      return `결제가 완료되었습니다. 영수증: ${status.receiptId}`;

    case "failed":
      return `결제에 실패했습니다. 사유: ${status.reason}`;

    default: {
      const exhaustiveCheck: never = status;
      return exhaustiveCheck;
    }
  }
}

-

type PaymentStatus =
  | { type: "ready"; amount: number }
  | { type: "paid"; receiptId: string }
  | { type: "failed"; reason: string }
  | { type: "cancelled"; cancelledAt: Date };

-

const exhaustiveCheck: never = status;

-

function assertNever(value: never): never {
  throw new Error(
    `처리하지 않은 값입니다: ${JSON.stringify(value)}`
  );
}

-

function getPaymentMessage(status: PaymentStatus): string {
  switch (status.type) {
    case "ready":
      return `결제 예정 금액은 ${status.amount}원입니다.`;

    case "paid":
      return `결제가 완료되었습니다. 영수증: ${status.receiptId}`;

    case "failed":
      return `결제에 실패했습니다. 사유: ${status.reason}`;

    default:
      return assertNever(status);
  }
}

-

type OnlyString<T> = T extends string ? T : never;

type Result = OnlyString<string | number | boolean>;
// 결과: string

-

OnlyString<string>  // string
OnlyString<number>  // never
OnlyString<boolean> // never

-

string | never | never

-

type ExcludeNumber<T> = T extends number ? never : T;

type Value = ExcludeNumber<string | number | boolean>;
// string | boolean

-

type RemoveId<T> = {
  [K in keyof T as K extends "id" ? never : K]: T[K];
};

interface User {
  id: number;
  name: string;
  email: string;
}

type UserWithoutId = RemoveId<User>;

-

type UserWithoutId = {
  name: string;
  email: string;
};

-

function printMessage(message: string): void {
  console.log(message);
}

-

function stopProgram(message: string): never {
  throw new Error(message);
}

-

???

댓글

타입스크립트 문자열 타입 사용 코드 예제

이미지
타입스크립트를 공부할 때 처음 접하게 되는 것이 타입이다. 타입스크립트는 자바스크립트와 비교된다. 자바스크립의 경우 변수에 데이터 타입에 상관없이 자유롭게 설정할 수 있지만, 타입스크립트는 변수나 함수에 들어갈 값의 타입을 미리 설정하여 사용한다. 데이터 타입를 사용하는 경우 이름은 문자열, 나이는 숫자, 로그인 여부는 참 또는 거짓으로 정해두면 코드 작성 중 실수를 줄일 수 있는데, 이는 다른 언어인 자바 또는 C#의 데이터 타입과 개념적으로 같다. 이제 문자열 타입인 string 타입 코드와 설명을 보자. Copy export {}; let name: string = "홍길동"; let message: string = "안녕하세요"; console.log(message); console.log(name); console.log(`${message}, ${name}님!`); let name: string = "홍길동";은 name이라는 변수를 만들고, 문자열인 "홍길동"을 설정하고 있다. : string은 이 변수에 문자열만 저장할 수 있다는 뜻이다. let message: string = "안녕하세요";는 message라는 변수에 "안녕하세요"라는 문자열을 설정한다. console.log()는 변수에 설정된 내용을 콘솔 화면에 출력하는 기능이다. 마지막 코드에서는 백틱과 ${변수명}을 사용하여 두 변수의 내용을 하나의 문장으로 연결할 수 있다.  실행결과는 다음과 같다. 타입스크립트 string  결과 - Copy export {}; // name 변수에는 문자열만 저장할 수 있습니다. let name: string = "홍길동"; console.log(name); // 문자열을 다시 대입하는 것은 가능합니다. // 숫자는 문자열 타입이 아니므로 대입할 수 없습니다. name = "김철수"; c...

이 블로그의 인기 게시물

ChatGPT Codex GitHub 연결 해제 방법 (앱 삭제까지 정리)

C언어 return 종류와 차이 | return, return 0, return -1, return n

챗지피티 코덱스와 깃허브 연동 방법 | VSCode 사용하기