제네릭에 대해 이렇게 실망스러운 사람은 저뿐인가요?
8359 단어 helptypescript
문제
여기 제 문제가 있습니다. 클래스/함수에 지정할 필요가 없는 여러 일반 유형이 있는 경우 코드가 다음과 같이 표시되는 경우가 종종 있습니다.
const instance = new GenericClass<any, any, number>();
또는
const result = genericFunction<string, any, any, number>();
기본적으로 내가 찾고 있는 것은 기본 유형을 그대로 두려는 모든 일반 유형을 지정하지 않는 것입니다.
내 솔루션
이 문제를 많이 연구했지만 역시 문제가 되지 않는 해결책을 찾지 못하고 있습니다.
이것은 잠 못 이루는 밤 후에 내가 생각해 낸 것입니다.
먼저 제네릭 유형이 있는 속성을 지정하고 지정된 유형 또는 해당 속성에 대해 유형이 생략된 경우 기본 유형을 반환하는 GetGeneric 유틸리티 유형을 만듭니다.
type GenericProps = 'input' | 'output';
type AcceptedGenerics = { [Property in GenericProps]: any };
type GetGeneric<T extends Partial<AcceptedGenerics>, Prop extends keyof AcceptedGenerics, TDefault = any> = T extends Pick<AcceptedGenerics, Prop> ? T[Prop] : TDefault
그런 다음 클래스에 이 방법을 사용하는 방법은 다음과 같습니다.
class Obj<T extends Partial<AcceptedGenerics>> {
input: GetGeneric<T, 'input', string>
output: GetGeneric<T, 'output', string>
}
const instance = new Obj<{ output: number }>();
/*
instance = {
input: string,
output: number,
}
*/
그리고 여기 기능 버전이 있습니다.
function Func<T extends Partial<AcceptedGenerics>>(
input: GetGeneric<T, 'input'>
): GetGeneric<T, 'output', {}> {
return { } as GetGeneric<T, 'output', {}>;
}
const result = Func<{ input: number, output: { prop: string } }>(2);
/*
Func<{ input: number, output: { prop: string } }>() = (input: number) => { prop: string }
*/
또한 GetGeneric 유틸리티 유형을 확장하여 사용하면 코드가 지저분해 보일 수 있으므로 모든 일반 유형을 다음과 같이 정의할 수 있습니다.
function Func<T extends Partial<AcceptedGenerics>, TInput = GetGeneric<T, 'input'>, TOutput = GetGeneric<T, 'output', {}>>(
input: TInput
): TOutput {
return { } as TOutput;
}
그러나이 솔루션이 더 나은지 최악인지 확실하지 않습니다.
결론
이 솔루션에 대해 어떻게 생각하는지, 제안 사항이 있는지, 그리고 이것이 애초에 해결해야 할 문제라고 생각하는지 묻고 싶습니다.
Reference
이 문제에 관하여(제네릭에 대해 이렇게 실망스러운 사람은 저뿐인가요?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/juliancollinson2/am-i-the-only-one-who-finds-this-frustrating-about-generics-51ca텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)