[typescript] 타입 가드와 타입 단언의 차이점

타입 안정성은 TypeScript 개발에서 매우 중요한 측면입니다. JavaScript의 다이나믹 타입 성질로부터 오는 에러를 방지하기 위해서, 우리는 타입 가드와 타입 단언을 사용하여 변수와 오브젝트의 타입을 명확히 할 수 있습니다. 하지만, 두 가지 방법 간에는 어떠한 차이가 있을까요? 이번 블로그에서는 타입 가드와 타입 단언의 차이점을 알아보겠습니다.

타입 가드 (Type Guard)

타입 가드는 여러 가지 방법으로 사용될 수 있지만, 주로 typeof, instanceof, 사용자 정의 타입 가드 함수 등을 활용하여 변수나 오브젝트의 타입을 확인하는 것을 의미합니다. 이를 통해 TypeScript는 해당 블록 안에서 타입을 확정시키고, 다른 블록에선 그 타입을 사용할 수 있게 됩니다.

function isString(arg: any): arg is string {
  return typeof arg === 'string';
}

if (isString(myVar)) {
  // myVar는 이제 string 타입이다
  console.log(myVar.length);
}

타입 단언 (Type Assertion)

타입 단언은 개발자가 컴파일러에게 “나는 이 변수가 특정한 타입이다”라고 확신시키는 것입니다. 이는 <타입> 구문이나 as 구문을 사용하여 수행됩니다.

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

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

두 방법의 차이

타입 가드와 타입 단언의 가장 큰 차이점은 타입 단언은 컴파일러에게 무조건적으로 타입을 가정시키는 반면, 타입 가드는 조건에 따라 타입을 판별하여 그에 맞는 동작을 하게 만드는 것입니다. 타입 가드는 런타임에도 타입 정보를 가지고 있으나 타입 단언은 컴파일 이후에는 무시됩니다.

따라서, 타입 가드는 더 안전하게 타입을 판별하는 데에 사용되며, 타입 단언은 경우에 따라 사용하되, 가능한 사용을 자제해야 합니다.

결론

타입 가드와 타입 단언은 둘 다 TypeScript에서 변수와 오브젝트의 타입 안정성을 확보하는 데에 사용됩니다. 하지만, 각각의 사용 시점과 용도에 따라 두 가지 방법을 구분하여 사용하면서, 코드의 안정성을 높일 수 있습니다.