TypeScript 유형 가드
타입 가드는 개발자가 변수의 타입을 좁히기 위해 런타임 검사를 수행할 수 있게 해주는 TypeScript의 강력한 기능입니다. 이를 통해 더 정확한 타입 정보가 보장되어 더 안전하고 예측 가능한 코드가 만들어집니다. 이 문서에서는 타입 가드가 무엇이고 효과적으로 사용하는 방법을 살펴봅니다.
타입 가드란?
타입 가드는 런타임 검사를 수행하고 TypeScript가 변수에 대해 더 구체적인 유형을 유추할 수 있도록 하는 표현식입니다. 특히 유니언 유형을 다룰 때 다양한 유형을 구별하는 데 도움이 됩니다. 타입 가드는 다음을 포함한 다양한 기술을 사용하여 구현할 수 있습니다.
- 사용자 정의 유형 술어
- 유형 어설션
- 인스턴스 확인
typeof
연산자 사용in
연산자 사용
사용자 정의 유형 술어
사용자 정의 유형 술어는 부울 값을 반환하고 검사되는 변수의 유형을 나타내는 특수 반환 유형을 갖는 함수입니다. 이를 만들고 사용하는 방법은 다음과 같습니다.
function isString(value: any): value is string {
return typeof value === 'string';
}
function printString(value: any) {
if (isString(value)) {
console.log(value.toUpperCase()); // TypeScript knows value is a string here
} else {
console.log('Not a string');
}
}
위의 예에서 isString
은 TypeScript가 value
이 if
블록 내의 문자열임을 이해하도록 돕는 사용자 정의 유형 술어입니다.
유형 어설션
유형 어설션은 TypeScript에 변수를 특정 유형으로 취급하라고 지시합니다. 이 메서드는 런타임 검사를 수행하지 않지만 TypeScript 컴파일러에 유형에 대해 알립니다. 예를 들어:
function printLength(value: any) {
console.log((value as string).length); // Assert value is a string
}
이 예에서 value as string
은 TypeScript에 런타임 검사를 수행하지 않고 value
이 문자열이라고 가정하도록 지시합니다.
인스턴스 확인
인스턴스 검사는 객체가 특정 클래스의 인스턴스인지 확인하는 데 사용됩니다. 이는 클래스로 작업할 때 유형을 좁히는 데 유용합니다.
class Dog {
bark() { console.log('Woof'); }
}
class Cat {
meow() { console.log('Meow'); }
}
function speak(animal: Dog | Cat) {
if (animal instanceof Dog) {
animal.bark(); // TypeScript knows animal is a Dog here
} else {
animal.meow(); // TypeScript knows animal is a Cat here
}
}
이 예에서 instanceof
연산자는 TypeScript가 animal
의 클래스를 기반으로 해당 유형을 유추하는 데 도움이 됩니다.
typeof
연산자 사용
typeof
연산자는 string
, number
, boolean
과 같은 기본 유형을 확인하는 데 사용할 수 있습니다.
function processValue(value: string | number) {
if (typeof value === 'string') {
console.log(value.toUpperCase()); // TypeScript knows value is a string here
} else {
console.log(value.toFixed(2)); // TypeScript knows value is a number here
}
}
여기서 typeof
은 value
이 string
인지 number
인지 확인하고 그에 따라 유형을 축소하는 데 사용됩니다.
in
연산자 사용
in
연산자는 객체에 속성이 있는지 확인합니다. 이는 공통 속성을 공유하는 유형을 구별하는 데 유용합니다.
interface Bird {
fly: () => void;
}
interface Fish {
swim: () => void;
}
function move(creature: Bird | Fish) {
if ('fly' in creature) {
creature.fly(); // TypeScript knows creature is a Bird here
} else {
creature.swim(); // TypeScript knows creature is a Fish here
}
}
이 예에서 in
연산자는 TypeScript가 메서드의 존재 여부에 따라 creature
이 Bird
인지 Fish
인지 판별하는 데 도움이 됩니다.
결론
TypeScript 유형 가드는 유연하고 안전한 방식으로 유형을 다루는 데 필수적인 도구입니다. 이를 통해 보다 정확한 유형 검사가 가능하며, 다양한 시나리오에서 올바른 유형이 사용되도록 보장하여 런타임 오류를 방지할 수 있습니다. 유형 가드를 효과적으로 이해하고 사용하면 보다 견고하고 유지 관리하기 쉬운 TypeScript 코드를 얻을 수 있습니다.