/ TYPESCRIPT

TypeScript 강좌(3) - Data Type(Part 2)

TypeScript 강좌는 여러 절로 구성되어 있습니다.


TypeScript Data Type

  • any
  • void
  • null & undefined
  • never
  • type assertions

이전 포스트에서 기본적인 data type을 알아보았으니 이번에는 조금 더 색다른 data type을 살펴보도록 하겠습니다.


any

Application을 작성하는 시점을 기준으로 할 때 어떤 변수의 data type을 결정할 수 없는 경우가 아주 간혹 있습니다.

가장 쉬운 예로 3rd party library를 이용해 dynamic content를 로딩해 저장하는 변수를 생각하시면 됩니다. 즉, 동적으로 로딩되는 데이터의 타입이 runtime에 결정되므로 컴파일 타임에 data type을 지정할 수 없는 경우입니다.
(하지만 사실 우리는 대부분 데이터 타입을 정해놓고 구현을 진행하긴 합니다. ^^)

이런 경우 “어떠한 data type도 될 수 있다”라는 의미로 any data type을 이용할 수 있습니다. data type에 구애받지 않고 쉽게 코드를 작성할 수 있도록 만들어주지만 위에서 언급한 특정 목적을 제외하고는 당연히 사용하지 않는것이 좋습니다.

아래의 코드를 살펴보죠.

let myVar: any = 100;

myVar = "Hello World!!"; // 가능
myVar = true;            // 가능 

배열의 data type으로 any를 이용하여 서로 다른 data type으로 배열을 이용하는게 가능해집니다. 아래의 코드처럼 말이죠.

let myArr: any[] = [100, "Hello", true];

void

어디서 많이 본 것입니다. 일반적으로 void는 함수가 리턴값이 없을 때 함수의 리턴 type으로 이용합니다. 아래의 코드를 보시죠.

function myFunc(name: string) : void {
    console.log(`Hello, ${name}!!`);
}

myFunc("Moon");

일반 변수를 만약 void로 선언하면 어떻게 될까요? 변수를 void type으로 선언하면 해당 변수에는 null 혹은 undefined만 assign이 가능합니다. 이렇게 사용할 일이 과연 있을까 싶네요.

let myVar: void;
myVar = 100;       // 불가능(코드 에러)
myVar = "Hello";   // 불가능(코드 에러)
myVar = null;      // 가능
myVar = undefined; // 가능

여기서 주의해야 할 점은 tsconfig.json파일안에 compilerOptions 부분에 "strictNullChecks": false option을 설정해야 한다는 것입니다.


null & undefined

TypeScript에서 nullundefined는 값이자 하나의 data type입니다. 그렇기 때문에 다음과 같이 사용해야 합니다.

let myNull: null = null;

let myUndefined: undefined = undefined;

하지만 null과 undefined는 다른 모든 type의 subtype입니다. 쉽게 말하면 다른 모든 type에 null과 undefined 값을 assign할 수 있다는 말입니다.

여기서 주의해야 할 점은 만약 --strictNullChecks flag를 이용해 .ts파일을 컴파일 할 경우 null과 undefined는 void 혹은 자신의 data type에만 assign될 수 있게됩니다. (tsconfig.json파일안에서 "strictNullChecks": true로 설정한 경우를 의미 )

tsconfig.json파일안에 compilerOptions 부분에 "strictNullChecks": false option 적용한 경우

let myName: string = "홍길동";
let myVoid: void;
let myNull: null;
let myUndefined: undefined;

myName = null;            // 가능
myName = undefined;       // 가능

myVoid = null;            // 가능
myVoid = undefined;       // 가능

myNull = null;            // 가능
myNull = undefined;       // 가능

myUndefined = null;       // 가능
myUndefined = undefined;  // 가능

tsconfig.json파일안에 compilerOptions 부분에 "strictNullChecks": true option 적용한 경우

let myName: string = "홍길동";
let myVoid: void;
let myNull: null;
let myUndefined: undefined;

myName = null;            // 불가능
myName = undefined;       // 불가능

myVoid = null;            // 불가능
myVoid = undefined;       // 가능

myNull = null;            // 가능
myNull = undefined;       // 불가능

myUndefined = null;       // 불가능
myUndefined = undefined;  // 가능

never

never type은 일반적으로 함수의 리턴 타입으로 사용됩니다. 만약 함수의 리턴 type으로 never가 사용되면 해당 함수는 항상 exception을 발생시키던가 혹은 절대 return되지 않는다는 것을 의미합니다. 절대 return되지 않는다는 것은 무한 loop에 빠지는 것등을 의미합니다.

코드상으로 이해하자면 다음과 같은 경우입니다.

function error(message: string): never {
    throw new Error(message);
}
error("Something Wrong!!");



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

Type assertions

Type assertions는 컴파일러에게 “이 타입 사용이 맞아!!”라는 의미를 전달하는 것입니다. Type assertions 은 type casting과 같은 의미로 사용되지만 실제 특별한 체크작업이나 데이터 재구조화 작업이 발생하지 않습니다. TypeScript는 프로그래머가 특정한 type check를 진행했다고 가정한 후 컴파일을 진행합니다. ( TypeScript가 따로 검증하지 않는다는 거죠. )

Type assertions을 하는 방법은 2가지가 있습니다. angle-bracket syntax(<>)를 이용하는 방법과 as syntax를 이용하는 방법입니다. 아래의 코드를 보죠.

let myVar: any = "Hello World";

let myVarCount: number = (<string>myVar).length;

myVarCount = (myVar as string).length;

console.log((<number>myVar).toFixed());  // runtime error

any data type과 함께 사용되는 경우가 많으며 데이터 타입을 한정지어서 사용할 수 있도록 도와주는 역할을 합니다.

여기까지가 TypeScript의 기본 data type입니다. 다음 포스트는 변수를 선언하기 위한 키워드인 var, let, const에 대해서 알아보도록 하겠습니다.

End.


이 포스트의 내용은 아래의 사이트를 참조했습니다. 조금 더 자세한 사항을 알고 싶으시면 해당 사이트를 방문하세요!!