주어진 함수를 래핑하는 함수의 유형을 설정하는 방법

Nov 16 2020

나는 간단한 memoize함수를 하고 있는데 , 그것이하는 일은 함수를 취하고 반환 결과를 캐시하는 마법을 수행한다는 것입니다. 그러나 기본적으로 반환 된 함수의 유형 memoize은 주어진 것과 정확히 동일합니다. 하지만 수정하는 방법을 모르는 오류가 있습니다. 내가 가진 오류를 무시하면서 함수를 사용하면 유형이 작동합니다.

내 문제를 보여주기 위해 두 가지 기능을 만들었습니다. 내 관점에서는 두 가지 유형이 모두 작동해야하지만 두 번째 구현에 가까워지고 있지만 여전히 작동하지 않습니다.

다음은 TypeScript Playground에 대한 링크 이지만 만료 될 수있는 경우를 대비하여 오류를 보여주는 사진과 함께 일부 코드를 게시 할 것입니다.

function memoize1<F extends (...args: any[]) => Promise<any>>(func: F): F {
    return (...args) => func(...args)
}

function memoize2<F extends (...args: any[]) => Promise<any>>(func: F): (...args: Parameters<F>) => ReturnType<F> {
    return (...args) => func(...args)
}

const first = memoize1(() => {}) // Complains
const second = memoize1(async () => {}) // Works
const third = memoize2(() => {}) // Complains
const fourth = memoize2(async () => {}) // Works

다음은 첫 번째 예 와 두 번째 예에 대한 오류 이미지입니다.

답변

1 MartinGodzina Nov 16 2020 at 07:45

귀하의 질문에 언급 된이 동작에 따라 githup에 흥미로운 문제 가 있습니다. 원하는 유형에 대한 명시 적 캐스트는 함수로 인해 발생하는 컴파일 오류를 제거해야합니다.

function memoize1<F extends (...args: any[]) => Promise<any>>(func: F): F {
    return ((...args) => func(...args)) as F
}

function memoize2<F extends (...args: any[]) => Promise<any>>(func: F): (...args: Parameters<F>) => ReturnType<F> {
    return (...args) => func(...args) as ReturnType<F>
}

memoize1 호출이 실패하는 이유는 주어진 매개 변수 함수가 memoize1에서 지정한 약속을 반환하지 않기 때문입니다. F extends (...args: any[]) => Promise<any>

따라서 호출 memoize1(() => {})은 약속이 아닌 빈 객체를 반환하는 함수를 전달합니다. async 문을 사용하면 함수 반환 유형이 promise로 변경됩니다. 그게 memoize1(async () => {})작동하는 이유 입니다.

예를 들어 : const first = memoize1(() => new Promise((resolve, reject)=> {})약속을 반환하고 컴파일하는 함수를 전달합니다.