Bucklescript允许您定义原始js函数调用,但是我不清楚应该如何处理返回类型。似乎可以使用任何类型,并且仍然可以使用。例如,以下代码可以编译并运行,不会出现问题:
let f = [%raw {|
function() {
return 4;
}
|}]
let x : (string option) list = f ()
编译器不会抱怨x的类型为(string option) list
或任何其他虚假类型。通常,我只依赖于类型推断,但是我想将原始js函数调用的结果分配给结构中的字段,因此我必须在结构类型定义中为该字段定义类型。看来我也可以使用任何类型,并且仍然可以使用。这是预期的行为吗?有什么建议可以解决这些情况吗?
答案 0 :(得分:2)
是的,这是预期的行为。编译器不会尝试理解raw
块的内容,这使它们在一般情况下非常危险。如果存在语法错误,编译器将不会抱怨。
类型推断算法将始终尝试推断最通用的类型,而没有任何提示的话,它将是任何东西。它甚至不假设它是一个函数,因为它不一定必须是它。
%raw
是一个可以像其他任何表达式一样用类型注释的表达式。魔术发生在里面,而不是外面。您可以直接为表达式指定类型:
let f = ([%raw {|
function() {
return 4;
}
|}] : unit -> int)
或在绑定上,就像对x
一样:
let f : unit -> int = [%raw {|
function() {
return 4;
}
|}]