[TypeScript] Generic, Type Guard, Signature 및 Overload

이번 글에서는 제네릭(Generic), 타입 가드(Type Guard), 서명(Signature) 및 오버로드(Overload)의 영역을 살펴봅니다. 이러한 개념은 유연하고 재사용 가능하며 타입이 안전한 코드를 만들기 위한 기본 구성 요소입니다. 이 시리즈를 진행하면서 이러한 기능이 어떻게 강력하고 유지 관리가 쉬운 TypeScript 애플리케이션을 만드는 데 중추적인 역할을 하는지 알아볼 수 있습니다.

제네릭

TypeScript의 제네릭을 사용하면 타입을 매개변수로 전달할 수 있어 재사용 가능한 type-safe 함수 및 클래스를 만들 수 있습니다. 이를 통해 다양한 데이터 타입에서 작동할 수 있는 함수나 클래스를 작성할 수 있습니다.

1
2
3
4
5
6
function identity<T>(arg: T): T {
return arg;
}

const result = identity<string>('Hello, TypeScript!');
// result is of type string

이 예제에서 identity 함수는 T 타입에 대해 제네릭이므로 모든 타입에서 작동할 수 있습니다.

타입 가드

타입 가드는 특정 코드 블록 내에서 변수의 타입을 좁히는 방법입니다. 런타임 검사를 기반으로 타입별 연산을 수행하기 위해 유니온(union) 타입과 함께 자주 사용됩니다.

1
2
3
4
5
6
7
8
9
10
function isString(value: any): value is string {
return typeof value === 'string';
}

let x: any = 'Hello, TypeScript!';

if (isString(x)) {
// 이 블록 내에서, 타입스크립트는 x가 문자열이라는 것을 알고 있습니다.
console.log(x.length);
}

isString 함수는 조건부 블록 내에서 타입스크립트가 x의 타입을 이해하는 데 도움이 되는 타입 가드입니다.

Signature

TypeScript에서 함수 서명은 매개변수의 타입과 함수의 반환 타입을 설명합니다. 여기에는 매개변수 이름, 타입 및 반환 타입이 포함됩니다.

1
2
3
4
type MathOperation = (a: number, b: number) => number;

const add: MathOperation = (a, b) => a + b;
const subtract: MathOperation = (a, b) => a - b;

여기서 MathOperation은 두 개의 숫자를 취하고 숫자를 반환하는 함수를 나타내는 타입입니다. addsubtract 모두 이 서명을 준수하는 함수입니다.

Overload

함수 오버로드를 사용하면 단일 함수에 대해 여러 타입 서명을 제공할 수 있습니다. 이는 인수의 타입이나 수에 따라 함수가 다르게 동작할 때 특히 유용합니다.

1
2
3
4
5
6
7
8
9
10
function greet(person: string): string;
function greet(person: string, age: number): string;

function greet(person: string, age?: number): string {
if (age !== undefined) {
return `Hello, ${person}! You are ${age} years old.`;
} else {
return `Hello, ${person}!`;
}
}

이 예제에서 greet 함수에는 서로 다른 매개변수 타입을 지정하는 두 개의 오버로드가 있습니다. 실제 구현은 이러한 오버로드를 따르고 그에 따라 다양한 경우를 처리합니다.

결론

이러한 개념은 TypeScript에서 유연하고 유형이 안전한 코드를 작성하기 위한 강력한 도구 세트를 제공합니다.

Share