【发布时间】:2020-04-26 23:21:17
【问题描述】:
我不确定我是否在 Fable 的接口/编译器中发现了错误,或者我误用了类型系统/externs。
今天我遇到了一个非常令人沮丧的错误。像往常一样,我为我用 JS 编写的小函数键入了 extern,其中一个是从 NOSQL 数据库返回一个对象列表。显然寓言收到的对象不错。但是,当我尝试转换对象时,代码在没有任何错误或解释的情况下以不一致的方式死亡。
因为代码很复杂,包含 promise、解析和其他移动部分,我花了好几个小时才找出有罪的部分和原因,但最后我意识到 JS 数组与 F# 列表不匹配,这是我找到的唯一方法继续前进的内容如下:
type IJSInterface =
abstract FetchPosts: string -> JS.Promise<DBPost list>
...
// Transform Javascript array to F# normal list
let postList = straightJSArrayWithTypedPosts |> List.toArray |> Array.toList
我的问题是:与 javascript 数组交互的推荐方式是什么?因为我阅读了所有我能阅读的文档,但我找不到关于这部分的任何精确说明。我个人认为它更像是一个错误。事实上,我希望我可以用编译器错误来禁止这个“功能”,或者在 javascript 和 F# 之间实现即时数组安全互操作。有这样的编译器选项吗?编译器怎么能避免让我在这些问题上花费整个星期天呢?有没有flag什么的?
编辑:正如答案中所猜测的,省略的 javascript 代码实际上返回了一个与 list 不同的 javascript array,尽管两者非常相似,尽管在大多数情况下表现相同,但它们并不相同在动态语言中。
【问题讨论】: