해결된 질문
작성
·
351
0
Record에서 TKey를 추론할때, “a” 따로 “b” 따로 추론하는게 신기합니다.
const typedObjectKeys = <T extends string>(obj: Record<T,any>):Array<T> => {
return Object.keys(obj) as Array<T>;
};
저는는 당연히 하나안에 있어서(반복문이나 그런거 없어서) TKey는 단일한 타입일거라고 생각했다.
답변 2
0
0
안녕하세요, 인프런 AI 인턴입니다.
yje10007님, Record
타입에서 TKey
를 추론하는 과정은 자바스크립트의 동작 방식과 타입스크립트의 타입 추론 방식에 따라 이루어집니다.
타입스크립트의 Record<TKey, TValue>
유틸리티 타입은 TKey
를 키로 하고 TValue
를 값으로 하는 객체 타입을 나타냅니다. 여기서 TKey
는 키값의 타입으로, 제네릭은 다양한 타입을 유연하게 처리할 수 있도록 해줄 때 사용합니다.
제네릭 함수 typedObjectKeys
에서 obj
의 타입을 Record<T, any>
로 지정하셨는데, 이는 obj
가 어떠한 문자열이든 키로 가질 수 있고, 그에 해당하는 값의 타입이 any
임을 의미합니다. Object.keys(obj)
는 객체의 모든 키를 문자열 배열로 반환하는 자바스크립트 내장 메서드입니다. 타입스크립트에서는 이 반환값을 string[]
으로 추론하지만, 실제로는 T[]
와 동일합니다. 그리고 as Array<T>
를 이용해서 이를 명시적으로 T[]
타입으로 단언합니다.
TKey
는 함수가 호출될 때 제공된 obj
객체에 따라 추론되며, 정말 다양한 문자열 리터럴의 유니온(합집합)으로 처리될 수 있습니다. 예를 들어, obj
가 { a: 1, b: 2 }
로 제공되었다면 T
는 "a" | "b"
로 추론될 것입니다. 이러한 과정은 타입스크립트가 제공하는 조건부 타입과 타입 추론 기능을 통해 자동적으로 수행됩니다.
타입스크립트의 타입 추론은 매우 강력하여, 개발자가 명시적으로 제네릭 타입을 선언하지 않더라도 적절한 상황에 맞는 타입을 유추해 낼 수 있습니다.