여러 테스트 프레임워크가 키로 포함된 이 객체를 생각해 보겠습니다.
const testingFrameworks
vitest: {
label: "Vitest",
},
jest: {
label: "Jest",
},
mocha: {
label: "Mocha",
},
};
type TestingFramework = unknown;
vitest, jest, mocha 키를 유니온 타입으로 추출해야 합니다.
다음과 같이 수동으로 유니온을 생성하면 테스트를 충족할 수 있습니다.
type TestingFramework = 'vitest' | 'jest' | 'mocha';
하지만 이상적인 해결책은 typeof 와 아직 보여드리지 않은 새로운 구문을 사용하여 객체에서 직접 키를 추출하여 유니온을 생성하는 것입니다.
import { Equal, Expect } from '../helpers/type-utils';
const testingFrameworks = {
vitest: {
label: 'Vitest',
},
jest: {
label: 'Jest',
},
mocha: {
label: 'Mocha',
},
};
type TestingFramework = keyof typeof testingFrameworks;
type tests = [Expect<Equal<TestingFramework, 'vitest' | 'jest' | 'mocha'>>];
typeof 연산자만 사용하면 전체 객체를 타입으로 반환하게 되는데, 이는 우리가 원하는 것이 아닙니다.
testingFramework 객체의 키만으로 유니온 타입을 생성하려면, 각 최상위 키에 대해 반복하기 위해 keyof 연산자도 사용해야 합니다.
type TestingFramework = keyof typeof testingFrameworks;
이렇게 하면 테스트에서 예상한대로 “vitest" | "jest” | “mocha” 가 반환됩니다.
keyof 연산자는 KeyOf<...> 처럼 호출되는 것이 아닌 고유한 전용 키워드가 있다는 점에 유의하세요. 이는 typeof 와 마찬가지로 매우 low-level 이기 때문입니다.