작성
·
88
1
안녕하세요, 항상 좋은 강의 감사드립니다.
제네릭 타입 제한 강의 내용에서 궁금한 점이 있습니다.
제네릭 타입 제한을 하기 위해
const shouldBeRecordTypeSolution = <T extends string>(t: T) => obj[t];
와 같은 형태로 T안에 들어올 수 있는 타입을 string으로 제한하는데요,
어차피 param의 타입을 특정 타입으로 제한할거면 아래와 같이 타입을 바로 정의해도 되는것 아닐까요?
const shouldBeRecordTypeSolution2 = (t: string) => obj[t];
param에 타입을 특정 타입으로 제한해야 하는 경우,굳이 제네릭 타입 제한을 사용하는 이유가 특별히 있을까요 ? 사용 시 차이점을 잘 모르겠어서 여쭤봅니다 ㅜㅜ
답변 1
0
안녕하세요 시원님 😃
올려주신 예시에선 사실 제한하는 이유를 찾기란 쉽지 않습니다.
아래의 예제를 보시면 조금 사용하는 이유를 찾을 수 있지 않을까 생각하는데, obj
에서 object의 key들만 접근하고 싶을 때 아래와 같이 코드를 작성할 수 있습니다.
function getValue<T extends string>(key: T, obj: Record<T, number>) {
return obj[key];
}
const obj = { key1: 1, key2: 2 };
getValue('key1', obj); // 'key1' 타입으로 안전하게 호출 가능
getValue('key3', obj); // 컴파일 에러 (key3는 obj의 키가 아님)
Record의 타입 첫번째 인자는 항상 string | symbol | number
가 와야 하는데요. 이 경우에는 string으로 강제하기 위해 T extends string
string 타입으로 제한했습니다.
강의를 조금만 더 들어보시면 제네릭 타입 제한하는 문제들이 있으니 한번 풀어보시면 어느 상황에서 사용할 수 있으신지 깨닫게 되실거에요.
그래도 만약 이해가 되지 않으신다면 질문 남겨주세요!