TypeScript

[TypeScript - 3] Primitive types (원시 타입)

whitecoding 2023. 6. 6. 16:13

타입스크립트(TypeScript)에서는 기본적으로 JavaScript의 원시 타입(primitive types)을 모두 지원합니다. 

원시 타입은 객체가 아닌 실제 값을 나타내는 타입을 의미합니다. 

타입스크립트에서의 주요 원시 타입에는 다음이 포함됩니다.

boolean

불리언 타입은 true 또는 false 값을 가질 수 있는 논리 타입입니다.

let isDone: boolean = false;

number

JavaScript와 마찬가지로, 타입스크립트의 모든 숫자는 부동 소수점 값입니다. 

타입스크립트는 16진수 및 10진수 리터럴 외에도, ECMAScript 2015에 도입된 2진수 및 8진수 리터럴도 지원합니다.

let decimal: number = 6;
let hex: number = 0xf00d;
let binary: number = 0b1010;
let octal: number = 0o744;

string

텍스트 데이터 타입을 나타내는 데 사용됩니다.

let color: string = "white";
let fullName: string = `White Coding`;

null & undefined

JavaScript에서 null과 undefined는 실제로 각각 null과 undefined라는 자체적인 타입을 가집니다. 

타입스크립트에서도 이를 그대로 유지하며, 이 두 타입의 값은 자신들 자신 뿐입니다

(즉, null은 null 값만 가질 수 있고, undefined는 undefined 값만 가질 수 있습니다).

let u: undefined = undefined;
let n: null = null;

void

타입스크립트의 void 타입은 함수가 특별히 값을 반환하지 않을 때 사용됩니다. 

다시 말해, void는 반환 값이 없는 함수의 반환 타입으로 주로 사용됩니다. 

JavaScript에서는 함수가 명시적으로 값을 반환하지 않으면 undefined를 반환합니다. 

이러한 점을 고려할 때, void 타입은 일종의 undefined와 비슷한 개념이라고 할 수 있습니다.

 

다음은 void 타입이 사용되는 예입니다.

function warnUser(): void {
    console.log("This is my warning message");
}

이 함수는 반환 값을 갖지 않습니다. 그 결과, 이 함수를 호출하더라도 유용한 값을 얻을 수 없습니다.

또한, 변수에 void 타입을 선언하는 것은 그다지 유용하지 않습니다. 

왜냐하면 void 타입의 변수는 undefined 또는 null만 할당할 수 있기 때문입니다.

이런 이유로 void 타입은 주로 함수의 반환 타입으로만 사용됩니다.


any

타입스크립트의 any 타입은 가장 유연한 타입으로, any 타입에는 모든 종류의 값이 들어갈 수 있습니다. 

any 타입의 변수는 그 값과 관계없이 모든 연산을 수행할 수 있습니다.

let notSure: any = 4;
notSure = "maybe a string instead"; // okay
notSure = false; // okay
notSure = []; // okay
notSure = undefined; // okay

이것은 타입스크립트의 타입 검사를 회피하려는 경우에 유용하게 사용할 수 있습니다. 

any 타입은 기존 자바스크립트를 타입스크립트로 점진적으로 마이그레이션하거나,

타입 검사를 하고 싶지 않은 복잡한 구조, 또는 동적 컨텐츠에 특히 유용합니다.

 

하지만 가능한 한 any 타입의 사용을 최소화하는 것이 좋습니다. 

왜냐하면 any 타입을 사용하면 해당 변수에 대한 타입 검사가 이루어지지 않아, 

실수로 인한 버그를 미리 잡아낼 수 없기 때문입니다. 

때문에 타입스크립트의 주요 장점 중 하나인 컴파일 타임 타입 검사 기능을 최대한 활용하는 것이 좋습니다.


unknown

타입스크립트의 unknown 타입은 any 타입과 유사하게 어떤 값이든 할당할 수 있습니다. 

하지만 unknown 타입은 any와 달리 타입 안전성(type safety)을 제공합니다. 

즉, unknown 타입의 값을 다른 값에 할당하거나, 함수에 전달하거나, 메서드/프로퍼티에 접근하기 위해서는

해당 값의 타입을 좁히는 (즉, 타입을 더 구체적으로 지정하는) 타입 체크가 필요합니다.

 

예를 들어, 다음과 같이 unknown 타입의 값을 number 타입의 변수에 할당하려고 하면

타입스크립트 컴파일러는 오류를 발생시킵니다.

let value: unknown;
let value1: number = value;  // Error: Type 'unknown' is not assignable to type 'number'.

하지만 타입 체크를 수행하여 타입을 좁히면 오류가 발생하지 않습니다.

let value: unknown;
if (typeof value === "number") {
    let value2: number = value;  // No error
}

이렇게 unknown 타입을 사용하면, 값의 타입을 런타임에 결정하거나 검사해야 하는 경우에도 

타입 안전성을 보장할 수 있습니다. 이는 any 타입을 사용하는 것보다 좋은 방법일 수 있습니다. 

any 타입은 컴파일러가 타입 체크를 수행하지 못하게 하므로, 실수로 인한 오류를 미리 발견할 수 없기 때문입니다.


never

타입스크립트의 never 타입은 그 함수가 절대로 반환되지 않는다는 것을 나타냅니다.

주로 다음 두 가지 상황에서 사용됩니다.

1. 함수가 항상 예외를 발생시키는 경우
2. 함수가 무한 루프에 빠지는 경우

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

function infiniteLoop(): never {
  while (true) {}
}

error 함수는 항상 예외를 발생시키므로 반환값이 없습니다. 이 경우 반환 타입으로 never를 사용할 수 있습니다.

 

infiniteLoop 함수는 무한 루프에 빠지므로 함수가 정상적으로 종료되지 않습니다. 

이 경우에도 반환 타입으로 never를 사용할 수 있습니다.

 

never 타입은 타입스크립트의 특수한 타입 중 하나로, 어떤 타입도 할당할 수 없는 특별한 타입입니다. 

any 타입과는 반대로, never는 모든 타입의 서브 타입이며, 모든 타입에 할당할 수 있지만, 

다른 타입은 never에 할당할 수 없습니다. 이는 코드의 안정성을 높이는데 도움이 됩니다.