제네릭에 대해 이렇게 실망스러운 사람은 저뿐인가요?

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; 
}


그러나이 솔루션이 더 나은지 최악인지 확실하지 않습니다.

결론



이 솔루션에 대해 어떻게 생각하는지, 제안 사항이 있는지, 그리고 이것이 애초에 해결해야 할 문제라고 생각하는지 묻고 싶습니다.

좋은 웹페이지 즐겨찾기