noImplicitAny не работи с обща функция от по-висок ред

Във фрагмента по-долу typescript не излъчва никаква грешка, въпреки че има аргумент, имплицитно въведен като any.

declare function constrainedHOF<T extends (...args: any[]) => any>(callback: T): T;

// x is implicitly any, but typescript does not complain
const hof = constrainedHOF(x => {
    console.log(x);
});

Предполагам, че проблемът е ограничението на типа T extends (...args: any[]) => any, което кара typescript да мисли, че е изрично any.

Как да се реши това правилно, като едновременно се запази ограничението на общия тип да бъде функция от всякакъв тип и се накара typescript да се оплаква от имплицитно any, когато срещне случайно ненаписано обратно извикване вътре в constrainedHOF?

Тестван в последния стабилен Typescript 3.9.2.

I prepared a Playground Link that demonstrates the problem including a проверете дали проблемът наистина идва от общото ограничение.


person amik    schedule 23.07.2020    source източник


Отговори (1)


Какво ще кажете за използването на интерфейса Function?

// according to your declaration, you return a function, is that correct?    
declare function callbackHOF<T extends Function>(callback: T): T

// @ts-expect-error noImplicitAny
const callbackHofNonTyped = someHOF(x => {
    console.log(x);
});

const callbackHofTyped = someHOF((x: number) => {
    console.log(x);
});

here's a playground link

person Gonzalo.-    schedule 24.07.2020
comment
Благодаря! наистина работи. Просто си спомням, че видях някъде, че използването на типа Function е остаряло, но сега не мога да намеря надежден източник за това. Освен това няма да покрие всички случаи, като <T extends (foo: number, ...args: any[]) => any>, но за моя случай е достатъчно :) - person amik; 24.07.2020
comment
Открих първия проблем с функцията. TS не може да работи по никакъв начин с типа функция, който по някакъв начин е необходим в повечето HOF. Playground Link - person amik; 28.07.2020