Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F#Fable和JS互操作:不安全列表转换_F#_Fable F# - Fatal编程技术网

F#Fable和JS互操作:不安全列表转换

F#Fable和JS互操作:不安全列表转换,f#,fable-f#,F#,Fable F#,我不确定我是否在Fable的接口/编译器中发现了错误,或者我误用了system/externs类型 今天我遇到了一个非常令人沮丧的错误。像往常一样,我在JS中编写的小函数中键入externs,其中一个函数从NOSQL数据库返回一个对象列表。显然寓言收到了很好的效果。然而,当我试图转换对象时,代码没有任何错误,也没有以不一致的方式进行解释 由于代码复杂,包含承诺、解析和其他移动部分,我花了好几个小时才找到罪魁祸首和原因,但最终我意识到JS数组与F#List不匹配,我发现唯一可以继续前进的方法是:

我不确定我是否在Fable的接口/编译器中发现了错误,或者我误用了system/externs类型

今天我遇到了一个非常令人沮丧的错误。像往常一样,我在JS中编写的小函数中键入externs,其中一个函数从NOSQL数据库返回一个对象列表。显然寓言收到了很好的效果。然而,当我试图转换对象时,代码没有任何错误,也没有以不一致的方式进行解释

由于代码复杂,包含承诺、解析和其他移动部分,我花了好几个小时才找到罪魁祸首和原因,但最终我意识到JS数组与F#List不匹配,我发现唯一可以继续前进的方法是:

type IJSInterface =
    abstract FetchPosts: string -> JS.Promise<DBPost list>

...

// Transform Javascript array to F# normal list
let postList = straightJSArrayWithTypedPosts |> List.toArray |> Array.toList
类型IJSInterface=
抽象FetchPosts:string->JS.Promise
...
//将Javascript数组转换为F#正常列表
让postList=straightJSArrayWithTypedPosts |>List.toArray |>Array.toList
我的问题是:推荐使用哪种方式与javascript数组进行接口?因为我读了所有我能读到的文档,我找不到任何关于这部分的精确说明。我个人认为这更像是一个bug。事实上,我希望我可以禁止这个带有编译器错误的“特性”,或者在javascript和F#之间实现即时的数组安全互操作。有这样的编译器选项吗?编译器怎么能避免让我花整个星期天在这些问题上?有国旗什么的吗



编辑:正如答案中猜测的那样,省略的javascript代码实际上返回的javascript数组与列表不同,尽管两者非常相似,但它们并不相同,尽管在动态语言中,它们在大多数情况下表现相同。

如果我正确理解这个问题,问题是JavaScript API返回数组,但您希望将这些数组视为F#列表

Fable中外部API的类型工作方式是,您必须定义类型“因为它是由外部JavaScript API生成的”。编译器不会进行任何转换,也不会在运行时尝试检查这一点,因此您只需要正确地进行转换。如果在实际JavaScript API生成数组的位置使用
list
,则键入外部库是错误的

因此,在这种情况下,我认为您应该使用:

type IJSInterface =
    abstract FetchPosts: string -> JS.Promise<DBPost[]>
类型IJSInterface=
抽象FetchPosts:string->JS.Promise

这会使您的F#API稍显逊色,但在调用JavaScript代码时,这是意料之中的。

谢谢您的回答。我做了测试,结果很好,所以我想把数组错当成列表是不好的,因为它们实际上不是同义词,这让我现在想把脑袋撞到桌面上:昨天这个错误让我花了很多时间。我希望进行一些运行时检查,但是编译器运行得很平稳,运行时没有错误,除了一些实际不起作用的东西。你在哪里找到这方面的文件?我们可以强制编译器防止这种安静的故障并执行运行时检查吗?(至少是直接外间电话?)