首页 > 解决方案 > 如何正确处理bucklescript中原始js函数调用的结果类型

问题描述

Bucklescript 允许定义原始 js 函数调用,但我不清楚应该如何处理返回类型。似乎可以使用任何类型,它仍然可以工作。例如,此代码编译并运行没有问题:

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

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

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

标签: typesocamlffibucklescript

解决方案


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

类型推断算法将始终尝试推断最通用的类​​型,否则将是……任何东西。它甚至不认为它是一个函数,因为它不一定是。

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

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

或在装订上,就像你做的那样x

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

推荐阅读