Мы используем Flow для статической проверки типов в JavaScript.Типы потока могут быть сложными, и у нас были проблемы, когда мы думали, что у нас есть хорошие средства защиты статического типа от уродливых объектов, но проблемы с аннотациями потока означали, что проверка типов на самом деле не улавливала проблемы.
Чтобы предотвратить эту проблемуЯ хотел бы написать основанные на типах «модульные тесты», которые могут статически утверждать наши предположения о защите типов.Это легко, если я хочу подтвердить «действительный» случай, используя утверждения типа :
type User = {|
name: string
|};
const user = {name: "Bob"};
(user: User);
Это пройдет, если user
является действительным User
, и тип ошибкипроверьте, если это не так.
Однако, чтобы подтвердить фактическую проверку типов защиты, мы должны иметь возможность утверждать Flow errors .Например, допустим, я хотел убедиться, что это неверно:
const user = {name: "Bob", age: 40};
Я могу сделать тестовый проход с помощью
// $ExpectError
const user = {name: "Bob", age: 40};
, но не могу заставить его потерпеть неудачу с
// $ExpectError
const user = {name: "Bob"};
Очевидно, что этот пример довольно тривиален, но более сложные типы (например, с генериками) могут выиграть от этого типа тестирования.
Опции, которые я рассмотрел:
- Я мог бы потенциально запустить
flow
как внешний процесс для определенных файлов и затем утверждать, что он возвратил ошибку, но для этого потребуется один файлдля каждого теста - Я мог бы использовать flow-runtime для доступа к типам во время выполнения и использовать их в модульных тестах, но это не дает статических утверждений
Есть ли способ статически утверждать, что утверждение потока должно завершиться неудачей, и выдать ошибку, если это не так?