keyof와 typeof 연산자는 TypeScript의 강력한 타입화 도구입니다. 이들을 함께 사용하면 즉석에서 타입을 생성하고, 안전한 함수를 만들며, 객체의 구조를 최대한 유연하게 표현할 수 있습니다.
TypeScript에서 typeof는 변수에 따라 타입을 추론하는 데 사용되고, keyof는 객체 또는 타입의 모든 키의 union을 반환합니다. 이 둘을 결합하면 동적으로 선언된 객체를 다루고 상호 연관된 타입을 생성할 수 있습니다.
이런 연산자가 없으면 객체, enum 및 맵을 다룰 때 수동으로 키의 문자열을 타입과 값에 반복적으로 작성해야 할 경우가 많아져 동기화 오류를 일으키고 코드 유지 보수를 복잡하게 합니다.
typeof를 사용하여 변수의 값으로부터 타입을 얻고, keyof를 사용하여 모든 키의 union 타입을 만듭니다. 결과적으로 타입화가 자동화됩니다.
코드 예:
const ERRORS = { NOT_FOUND: 'Not found', UNAUTHORIZED: 'Unauthorized', SERVER_ERROR: 'Server error', }; // typeof를 통해 타입을 얻고, keyof를 통해 객체의 모든 키를 얻습니다. function getErrorMessage(code: keyof typeof ERRORS): string { return ERRORS[code]; }
주요 특징:
typeof를 통해 얻은 객체의 값이 union 타입의 키가 자동으로 될 수 있나요?
아니요, typeof는 객체 구조의 타입을 반환할 뿐 값은 반환하지 않습니다. 값을 union으로 얻으려면 값의 타입을 별도로 추론해야 합니다.
enum에 대해 typeof는 무엇을 반환하며, keyof typeof는 무엇을 반환하나요?
enum에 대해 typeof는 enum 객체의 타입을 반환하고 (key-value와 value-key 모두 방향을 포함), keyof typeof는 이 객체의 문자열/숫자 키의 union을 제공합니다. 예:
enum Colors { Red = 'R', Blue = 'B' } type ColorKeys = keyof typeof Colors; // 'Red' | 'Blue'
keyof typeof를 사용하여 객체의 키를 받는 함수의 모든 가능한 매개변수에 대해 type-safe 리스트를 얻을 수 있나요?
네, 이렇게 하면 허용되는 키만 받는 함수를 만들 수 있습니다. 이는 객체의 키를 다룰 때 오류를 방지합니다.
const config = { mode: 'dark', lang: 'ru' }; type ConfigKeys = keyof typeof config; // 'mode' | 'lang' function useConfig(key: ConfigKeys) { // ... }
keyof typeof가 배열의 값에 적용될 것이라는 잘못된 기대 — 배열의 경우 인덱스입니다, 값이 아닙니다.typeof가 타입 수준에서 작동하며 runtime 값을 반환하지 않는다는 이해 부족.API 상태와 관련된 상수에서 문자열 키의 타입을 수동으로 지정합니다:
type StatusCodes = 'OK' | 'FAIL' | 'PENDING'; function isKnownStatus(code: StatusCodes) { /* ... */ }
장점:
단점:
리스트의 자동 지원을 위해 keyof typeof를 사용합니다:
const STATUS = { OK: 1, FAIL: 0, PENDING: 2 }; type StatusKeys = keyof typeof STATUS; function checkStatus(key: StatusKeys) { /* ... */ }
장점:
단점: