Почему Typescript говорит мне, что тип X - это подтип, отличный от СЕБЯ? - PullRequest
1 голос
/ 18 июня 2020

Реальный код, в котором у меня возникла эта проблема, включает передачу 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.

И если я не правильно прочитал ... как мне это правильно прочитать ? щ(ಥДಥщ)

Ответы [ 2 ]

0 голосов
/ 20 июня 2020

Наличие ошибки, по-видимому, является предполагаемым поведением --strictFunctionTypes режима (хотя бессмысленный текст ошибки, вероятно, имеет меньшее значение). Ошибка исчезнет, ​​если я введу "strictFunctionTypes": false в свой tsconfig. json. К сожалению, это также приводит к появлению совершенно новых ошибок, которые гораздо труднее решить, поэтому мне просто придется смириться с написанием повторяющихся многословных типов функций, как uamanager предлагает .

0 голосов
/ 18 июня 2020

Добавление типа к acceptFooBoxAction решает вашу проблему.

interface FooBox<T = any> {
    foo: T
}

type FooAction<ReturnType = any, F extends FooBox = FooBox> = (fooBox: F) => ReturnType;

function acceptFooBoxAction<F extends FooBox = FooBox>(fooAction: FooAction<any, F>) {
    // do stuff
}

function acceptFooBoxOrSubtypeAction<F extends FooBox = FooBox>(fooAction: FooAction<any, F>) {
    acceptFooBoxAction(fooAction);
}

Проблема в том, что функция acceptFooBoxAction принимает действие с типом FooAction<any, FooBox>, но FooAction в этом случае не то же самое, что * Тип 1008 * передан из функции acceptFooBoxOrSubtypeAction.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...