본문 바로가기

개발/TYPESCRIPT

[TypeScript] 타입스크립트 기본 타입

728x90
반응형

배열 (Array)


TypeScript는 JavaScript처럼 값들을 배열로 다룰 수 있게 해줍니다. 배열 타입은 두 가지 방법으로 쓸 수 있습니다. 첫 번째 방법은, 배열 요소들을 나타내는 타입 뒤에 []를 쓰는 것입니다:

let list: number[] = [1, 2, 3];



두 번째 방법은 제네릭 배열 타입을 쓰는 것입니다. Array<elemType>:

let list: Array<number> = [1, 2, 3];

 

-> 제네릭 타입은 Array<타입>의 형식을 취하고 있다.

 

튜플 (Tuple)

튜플 타입을 사용하면, 요소의 타입과 개수가 고정된 배열을 표현할 수 있습니다. 단 요소들의 타입이 모두 같을 필요는 없습니다. 예를 들어, number, string 이 쌍으로 있는 값을 나타내고 싶을 수 있습니다:

// 튜플 타입으로 선언
let x: [string, number];
// 초기화
x = ["hello", 10]; // 성공
// 잘못된 초기화
x = [10, "hello"]; // 오류

정해진 인덱스에 위치한 요소에 접근하면 해당 타입이 나타납니다.

console.log(x[0].substring(1)); // 성공
console.log(x[1].substring(1)); // 오류, 'number'에는 'substring' 이 없습니다.

정해진 인덱스 외에 다른 인덱스에 있는 요소에 접근하면, 오류가 발생하며 실패합니다.

x[3] = "world"; // 오류, '[string, number]' 타입에는 프로퍼티 '3'이 없습니다.

console.log(x[5].toString()); // '[string, number]' 타입에는 프로퍼티 '5'가 없습니다.

-> 튜플 타입은 배열이지만 요소의 타입과 개수가 고정되어 있다. [문자열,숫자]로 제정되면 그 형식만 들어가야 한다.

 

열거 (Enum)

JavaScript의 표준 자료형 집합과 사용하면 도움이 될만한 데이터 형은 enum입니다. C# 같은 언어처럼, enum은 값의 집합에 더 나은 이름을 붙여줄 수 있습니다.

enum Color {Red, Green, Blue}
let c: Color = Color.Green;

기본적으로, enum은 0부터 시작하여 멤버들의 번호를 매깁니다. 멤버 중 하나의 값을 수동으로 설정하여 번호를 바꿀 수 있습니다. 예를 들어, 위 예제를 0대신 1부터 시작해 번호를 매기도록 바꿀 수 있습니다.

enum Color {Red = 1, Green, Blue}
let c: Color = Color.Green;

또는, 모든 값을 수동으로 설정할 수 있습니다:

enum Color {Red = 1, Green = 2, Blue = 4}
let c: Color = Color.Green;

enum의 유용한 기능 중 하나는 매겨진 값을 사용해 enum 멤버의 이름을 알아낼 수 있다는 것입니다. 예를 들어, 위의 예제에서 2라는 값이 위의 어떤 Color enum 멤버와 매칭되는지 알 수 없을 때, 이에 일치하는 이름을 알아낼 수 있습니다:

 

enum에 정의된 값은 이름 그대로 상수이며, 변경할 수 없습니다. 따라서, Color.Green = 2와 같이 값을 변경하려고 하면 컴파일 오류가 발생합니다.

enum Color {Red = 1, Green, Blue}
let colorName: string = Color[2];

console.log(colorName); // 값이 2인 'Green'이 출력됩니다.

->한정된 값 중 하나를 선택하는 데 사용되는 타입이다

->배열의 인덱스 같은 기능 / 그러나 번호매김을 0이 아닌 값부터 시작하게 바꿀 수 있다.

 

위 코드는 아래 자바스크립트 코드로 변환된다.

var Color;
(function (Color) {
    Color[Color["Red"] = 1] = "Red";
    Color[Color["Green"] = 2] = "Green";
    Color[Color["Blue"] = 3] = "Blue";
})(Color || (Color = {}));
let colorName = Color[2];
console.log(colorName); // 값이 2인 'Green'이 출력됩니다.

-> enum 형식은 0자바스크립트로 변환하면 결국 감춰진 배열 형식이라고 판단된다.

-> Color.Green 같은 형식의 표현은 당연히 오류가 발생할 수 밖에 없다.

 

 

Void

void는 어떤 타입도 존재할 수 없음을 나타내기 때문에, any의 반대 타입 같습니다. void는 보통 함수에서 반환 값이 없을 때 반환 타입을 표현하기 위해 쓰이는 것을 볼 수 있습니다:

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

void를 타입 변수를 선언하는 것은 유용하지 않은데, 왜냐하면 그 변수에는 null(--strictNullChecks을 사용하지 않을 때만 해당, 자세한 건 다음 섹션을 참고)또는 undefined 만 할당할 수 있기 때문입니다:

let unusable: void = undefined;
unusable = null; // 성공  `--strictNullChecks` 을 사용하지 않을때만

-> 함수에서 return 값이 있으면 return 값에 맞는 타입을 적어줘야 한다.

 

Never

never 타입은 절대 발생할 수 없는 타입을 나타냅니다. 예를 들어, never는 함수 표현식이나 화살표 함수 표현식에서 항상 오류를 발생시키거나 절대 반환하지 않는 반환 타입으로 쓰입니다. 변수 또한 타입 가드에 의해 아무 타입도 얻지 못하게 좁혀지면 never 타입을 얻게 될 수 있습니다.

never타입은 모든 타입에 할당 가능한 하위 타입입니다. 하지만 어떤 타입도 never에 할당할 수 있거나, 하위 타입이 아닙니다.(never 자신은 제외) 심지어 any  never에 할당할 수 없습니다.

never를 반환하는 몇 가지 예제입니다:

// never를 반환하는 함수는 함수의 마지막에 도달할 수 없다.
function error(message: string): never {
    throw new Error(message);
}

// 반환 타입이 never로 추론된다.
function fail() {
    return error("Something failed");
}

// never를 반환하는 함수는 함수의 마지막에 도달할 수 없다.
function infiniteLoop(): never {
    while (true) {
    }
}

-> 일반적으로 사용되지 않고, 오류를 발생시키거나 절대 반환하지 않는 반환 타입으로 쓰인다.

 

객체 (Object)

object는 원시 타입이 아닌 타입을 나타냅니다. 예를 들어, number, string, boolean, bigint, symbol, null, 또는 undefined 가 아닌 나머지를 의미합니다.

object 타입을 쓰면, Object.create 같은 API 가 더 잘 나타납니다. 예를 들어:

declare function create(o: object | null): void;

create({ prop: 0 }); // 성공
create(null); // 성공

create(42); // 오류
create("string"); // 오류
create(false); // 오류
create(undefined); // 오류

타입 단언 (Type assertions)

가끔, TypeScript보다 개발자가 값에 대해 더 잘 알고 일을 때가 있습니다. 대개, 이런 경우는 어떤 엔티티의 실제 타입이 현재 타입보다 더 구체적일 때 발생합니다.

타입 단언(Type assertions) 은 컴파일러에게 "날 믿어, 난 내가 뭘 하고 있는지 알아"라고 말해주는 방법입니다. 타입 단언은 다른 언어의 타입 변환(형 변환)과 유사하지만, 다른 특별한 검사를 하거나 데이터를 재구성하지는 않습니다. 이는 런타임에 영향을 미치지 않으며, 온전히 컴파일러만 이를 사용합니다. 타입 스크립트는 개발자가 필요한 어떤 특정 검사를 수행했다고 인지합니다.

타입 단언에는 두 가지 형태가 있습니다. 하나는, "angle-bracket" 문법입니다:

let someValue: any = "this is a string";

let strLength: number = (<string>someValue).length;

다른 하나는 as-문법 입니다.

let someValue: any = "this is a string";

let strLength: number = (someValue as string).length;

위 두 예제는 동일합니다. 어떤 것을 사용할지는 주로 선호에 따른 선택입니다. 하지만 TypeScript를 JSX와 함께 사용할 때는, as-스타일의 단언만 허용됩니다.

728x90
반응형