как правильно обработать тип результата вызова функции js raw в bucklescript - PullRequest
0 голосов
/ 30 января 2019

Bucklescript позволяет определять необработанные вызовы функций js, но мне не ясно, как должен обрабатываться возвращаемый тип.Кажется, можно использовать любой тип, и он все еще будет работать.Например, этот код компилируется и запускается без проблем:

let f = [%raw {|
  function() {
    return 4;
  }
|}]

let x : (string option) list = f ()

Компилятор не будет жаловаться, что x имеет тип (string option) list или любой другой фиктивный тип.Обычно я просто полагаюсь на вывод типа, но я хочу присвоить результат вызова функции js-сырца полю в структуре, поэтому мне нужно определить тип для этого поля в определении типа структуры.Кажется, я также могу использовать любой тип, и он все еще будет работать.Это ожидаемое поведение?Есть ли какие-либо рекомендации для решения этих случаев?

1 Ответ

0 голосов
/ 30 января 2019

Да, это ожидаемое поведение.Компилятор не пытается понять содержимое блоков raw, что делает их довольно опасными для использования в целом.Если есть синтаксическая ошибка, компилятор не будет жаловаться.

Алгоритм вывода типа всегда будет пытаться вывести наиболее общий тип, который без каких-либо подсказок в противном случае будет ... чем угодно.Он даже не предполагает, что это функция, поскольку это не обязательно.

%raw - это выражение, которое можно аннотировать типом, как любое другое выражение.Магия происходит внутри, а не снаружи.Вы можете либо дать выражению тип напрямую:

let f = ([%raw {|
  function() {
    return 4;
  }
|}] : unit -> int)

, либо связать, как вы делаете с x:

let f : unit -> int = [%raw {|
  function() {
    return 4;
  }
|}]
...