如何正确处理扣脚本中的原始js函数调用的结果类型

时间:2019-01-30 05:24:18

标签: types ocaml ffi bucklescript

Bucklescript允许您定义原始js函数调用,但是我不清楚应该如何处理返回类型。似乎可以使用任何类型,并且仍然可以使用。例如,以下代码可以编译并运行,不会出现问题:

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

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

编译器不会抱怨x的类型为(string option) list或任何其他虚假类型。通常,我只依赖于类型推断,但是我想将原始js函数调用的结果分配给结构中的字段,因此我必须在结构类型定义中为该字段定义类型。看来我也可以使用任何类型,并且仍然可以使用。这是预期的行为吗?有什么建议可以解决这些情况吗?

1 个答案:

答案 0 :(得分:2)

是的,这是预期的行为。编译器不会尝试理解raw块的内容,这使它们在一般情况下非常危险。如果存在语法错误,编译器将不会抱怨。

类型推断算法将始终尝试推断最通用的类​​型,而没有任何提示的话,它将是任何东西。它甚至不假设它是一个函数,因为它不一定必须是它。

%raw是一个可以像其他任何表达式一样用类型注释的表达式。魔术发生在里面,而不是外面。您可以直接为表达式指定类型:

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

或在绑定上,就像对x一样:

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