2016-10-22 8 views
3

Я использую flowjs некоторое время и большинство сообщений об ошибках вполне понятны, но теперь у меня есть что-то вроде этого:сообщение Странная ошибка «непостоянное использование определений библиотеки» в flowjs

src/framework/uitable/show.js:0 
inconsistent use of library definitions 
46: columns: Array<UiTableConfigColumnType> 
         ^^^^^^^^^^^^^^^^^^^^^^^ object type. This type is incompatible with. See lib: src/framework/uitable/uitable.js.flow:46 
52: type UiTableDataColsType = Array<string>; 
             ^^^^^^ string. See lib: src/framework/uitable/uitable.js.flow:52 

src/framework/uitable/show.js:0 
inconsistent use of library definitions 
52: type UiTableDataColsType = Array<string>; 
             ^^^^^^ string. This type is incompatible with. See lib: src/framework/uitable/uitable.js.flow:52 
46: columns: Array<UiTableConfigColumnType> 
         ^^^^^^^^^^^^^^^^^^^^^^^ object type. See lib: src/framework/uitable/uitable.js.flow:46 

и имеют нет идеи о том, что искать.

типы в определении, кажется, хорошо, они не связаны друг с другом и исходных точек на линии 0.

Я никогда не видел эту ошибку раньше, и я не ожидаю какой-либо помощи на отслеживание вниз фактический источник этой ошибки.

мне просто нужна помощь в понимании того, что сама ошибка означает, и почему flowjs сообщает об ошибке src/framework/uitable/show.js:0 в строке 0.

ответ

10

Что inconsistent use of library definitions значит?

Большинство ошибок потока возникают при обращении типа A к типу B. Например, если вы вызываете функцию, которая ожидает параметр с типом B, но вы передаете ему что-то с типом A. Когда это произойдет, Flow выдает ошибку о том, как тип A несовместим с типом B.

Иногда у вас есть код

// in file foo.js 
libraryCallB(libraryCallA()); 

В этом случае, может быть, возвращаемый тип libraryCallA() не совпадает с типом параметра libraryCallB(). Таким образом, Flow выдает ошибку, что типы несовместимы. Однако, поскольку оба вызова библиотеки определены в библиотеке (например, lib.js), сообщение об ошибке не будет упоминать foo.js. Это не идеально, так как ошибка, вероятно, находится в foo.js:0

Итак, в качестве обвязки мы просто отпечаток foo.js:0 в верхней части ошибки в качестве подсказки. Это означает, что мы были typechecking foo.js, когда мы заметили, что один тип библиотеки течет в несовместимый тип библиотеки.

Мы пытались улучшить сообщения об ошибках, поэтому эти ошибки должны быть менее распространенными. Но они все еще происходят.

Как насчет вашего кода?

  • ошибка, скорее всего, где-то в src/framework/uitable/show.js
  • Попробуйте flow check --traces 10 Он работает нормальный flow check, но сохраняет эти «следы», которые вроде как стек следов для внутренней логики проверки типа потока. Значение 10 означает трассировку печати до глубины 10. Результат трудно понять, если вы не знакомы с внутренними компонентами Flow, но, возможно, в нем указывается местоположение в src/framework/uitable/show.js, которое вызывает ошибку.
  • Я предполагаю, что ошибка связана с Array<string>, используемым как Array<UiTableConfigColumnType>, или наоборот.
+0

Большое спасибо за помощь. Используя 'flow check -traces 10', я теперь смог зафиксировать фактическую проблему и, как я полагаю, это на самом деле то, что, возможно, потребуется улучшить, я также создал урезанный пример того, как воспроизвести эту ошибку и создал отдельная проблема https://github.com/facebook/flow/issues/2673. – doberkofler

Смежные вопросы