Реальный код, в котором у меня возникла эта проблема, включает передачу redux Reducer
s с определенными подтипами c Action
, но для простоты я написал следующий пример, который также демонстрирует проблему:
interface FooBox<T = any> {
foo: T
}
type FooAction<ReturnType = any, F extends FooBox = FooBox> = (fooBox: F) => ReturnType;
function acceptFooBoxAction(fooAction: FooAction<any, FooBox>) {
// do stuff
}
function acceptFooBoxOrSubtypeAction<F extends FooBox = FooBox>(fooAction: FooAction<any, F>) {
acceptFooBoxAction(fooAction); // <------ ERROR ON THIS LINE
}
Полная ошибка, которую я получаю:
Argument of type 'FooAction<any, F>' is not assignable to parameter of type 'FooAction<any, FooBox<any>>'.
Type 'FooBox<any>' is not assignable to type 'F'.
'FooBox<any>' is assignable to the constraint of type 'F', but 'F' could be instantiated with a different subtype of constraint 'FooBox<any>'.
Обратите внимание, что типы, названные в начале и конце последней строки, совпадают : FooBox<any>
. Итак, если я правильно это читаю, он говорит мне, что FooBox<any>
- это другой подтип, чем сам .
Wut.
И если я не правильно прочитал ... как мне это правильно прочитать ? щ(ಥДಥщ)