>

정말로 해결할 수없는 흥미로운 문제가 있습니다.

함수의 객체를 취하는 함수를 만들고 싶습니다. 그리고 같은 키를 가지지 만 반환 유형이 다른 객체를 반환합니다 (반환 유형은 인수의 값에 따라 다릅니다.

예 :

declare function add(a: number, b: number): number
declare function str(a: string, b: string): string
declare function createObject(obj)
const result = createObject({
   addFn: add,
   strFn: str
}) 
/*
   result's TYPE should equal:
   {
      addFn: [number, (a: number, b: number) => number],
      strFn: [string, (a: string, b: string) => string]
   }
*/

내 의견으로는 이것이 해결할 수있는 것처럼 보이지만 어떻게 해야할지 모르겠습니다. 내 해상도에 가장 가까운 것은 다음 줄이었습니다.

type GenericHashTable<T> = { [key in keyof T]: T[key] };
function createAPI<T extends { [k: string]: any }>(fetchers: T) {
  const obj: GenericHashTable<T> = fetchers;
  return obj;
}

그러나이 선언문을 사용하면 반환 유형을 올바르게 변경할 수 없습니다.


  • 답변 # 1

    사전 정의 된 ReturnType 가 필요한 것 같습니다  조건부 유형 :

    declare function add(a: number, b: number): number
    declare function str(a: string, b: string): string
    type GenericHashTable<T extends Record<keyof T, (...a: any[]) => any>> = { [key in keyof T]: [ReturnType<T[key]>, T[key]] };
    declare function createAPI<T extends Record<keyof T, (...a: any[]) => any>>(fetchers: T): GenericHashTable<T>;
    const result = createAPI({
       addFn: add,
       strFn: str
    }) 
    // Same as
    const result: {
        addFn: [number, (a: number, b: number) => number];
        strFn: [string, (a: string, b: string) => string];
    }
    
    

  • 이전 angular - POST/PUT/PATCH 요청과 함께 페이로드 데이터를 Sentryio로 전송
  • 다음 reactjs - 자바 스크립트에서 이메일 주소를 마스킹하려면 Regex가 필요합니다