Функция fooA () возвращает «this», которое является экземпляром «A». Как вы знаете, класс A понятия не имеет, что метод fooB существует. Поэтому Flow (справедливо) указывает на то, что свойство fooB отсутствует в A.
Вы знаете, что на самом деле этот конкретный экземпляр A также является экземпляром B, но Flow не может это сделать. Вы должны сказать ему, что A, возвращаемая функцией fooA (), является экземпляром B в этом конкретном сценарии с использованием приведения.
Изменение вашего звонка на (new B().fooA(): B).fooB()
должно устранить ошибку потока.
Javascript (без потока) не заботится об этой семантике. Когда вы вызываете "fooB" для объекта, возвращаемого функцией fooA (), он просто ищет в объекте метод с именем "fooB", который, как оказалось, существует, поэтому он работает, хотя он более склонен к разрыву с помощью рефакторинга. Поток полезен, потому что он заставляет вас оставаться в курсе того, какие типы создаются, и дает вам проверки во время компиляции на наличие этих проблем в будущем.