TypeScript는 자바스크립트에 정적 타입 검사를 추가하여 더 안전하고 유지보수하기 쉬운 코드를 작성할 수 있게 해줍니다. 이 중에서도 `keyof`와 `typeof` 키워드는 객체 타입의 키를 다룰 때 매우 유용하게 사용됩니다. 이번 기사에서는 `keyof`와 `typeof`의 개념과 사용법을 설명하고, 이를 통해 타입 안전성을 강화하는 방법을 구체적인 예시를 통해 살펴보겠습니다.
1. typeof 연산자
TypeScript에서 `typeof` 연산자는 JavaScript에서 사용되는 `typeof`와 유사하게 작동하지만, 타입 시스템에서 타입을 가져오는 데 사용됩니다. 이는 변수나 객체의 타입을 가져와서 다른 곳에서 사용할 수 있게 합니다. 예를 들어:
const example = { a: 1, b: 2, c: 3 }; type ExampleType = typeof example; // ExampleType은 { a: number; b: number; c: number; } 타입을 가집니다.
위 예제에서 `ExampleType`은 `example` 객체의 타입을 반영하게 됩니다. 이로써 객체의 구조를 타입으로 활용할 수 있게 됩니다.
2. keyof 연산자
`keyof` 연산자는 주어진 타입의 모든 키를 문자열 리터럴 유니온 타입으로 변환합니다. 이는 객체 타입의 모든 키를 추출하여 타입으로 사용할 때 매우 유용합니다. 예를 들어:
type ExampleKeys = keyof ExampleType; // ExampleKeys는 "a" | "b" | "c" 타입을 가집니다.
위 예제에서 `ExampleKeys` 타입은 `ExampleType`의 키인 `”a”`, `”b”`, `”c”`를 유니온 타입으로 가집니다.
3. keyof와 typeof의 결합
이제 `keyof`와 `typeof`를 결합하여 객체의 키 타입을 동적으로 정의하는 방법을 살펴보겠습니다. 이는 타입 안전성을 강화하고 코드의 유연성을 높이는 데 매우 유용합니다.
const systemColor = { red: '#FF0000', green: '#00FF00', blue: '#0000FF' }; export type SystemcolorKeyType = keyof typeof systemColor; // SystemcolorKeyType은 "red" | "green" | "blue" 타입을 가집니다.
위 예제에서 `SystemcolorKeyType` 타입은 `systemColor` 객체의 키 중 하나일 수 있는 문자열 리터럴 타입으로 정의됩니다. 이는 TypeScript가 해당 키들 중 하나만 올바른 값으로 인식하게 합니다.
4. 실용적인 예제
이제 이를 활용한 실용적인 예제를 살펴보겠습니다. 특정 색상을 받아 그에 해당하는 값을 반환하는 함수를 정의한다고 가정해보겠습니다.
const systemColor = { red: '#FF0000', green: '#00FF00', blue: '#0000FF' }; export type SystemcolorKeyType = keyof typeof systemColor; function getColorCode(color: SystemcolorKeyType): string { return systemColor[color]; } // 올바른 예시 console.log(getColorCode('red')); // "#FF0000" console.log(getColorCode('green')); // "#00FF00" console.log(getColorCode('blue')); // "#0000FF" // 잘못된 예시 (컴파일 오류 발생) console.log(getColorCode('yellow')); // Error: Argument of type '"yellow"' is not assignable to parameter of type 'SystemcolorKeyType'.
이 함수는 `SystemcolorKeyType` 타입을 인수로 받아서 `systemColor` 객체에서 해당 색상의 값을 반환합니다. 잘못된 색상 키를 입력하면 컴파일 시점에서 오류가 발생하여 개발자가 실수를 미리 방지할 수 있습니다.
결론
TypeScript의 `keyof`와 `typeof`는 객체 타입의 키를 안전하고 유연하게 다룰 수 있게 해주는 강력한 도구입니다. 이를 통해 코드의 타입 안전성을 강화하고, 유지보수성을 높일 수 있습니다. 특히 대규모 프로젝트나 협업 환경에서 이러한 타입 시스템의 장점을 극대화할 수 있습니다.
TypeScript를 사용하면서 `keyof`와 `typeof`를 적절히 활용하면, 코드의 안정성과 가독성을 크게 향상시킬 수 있습니다. 앞으로 프로젝트를 진행할 때 이 두 연산자를 적극적으로 활용해보시기 바랍니다.