使用寓言在 F# 中解析 Thenable<'> 的语法是什么?

What is the syntax for resolving Thenable<'t> in F# using fable?

我正在开发一个用 F# 编写的 vscode 扩展,使用 Fable 编译为 javascript。许多 api 的 return 的承诺。解析具有 return 类型(例如 F# 的 Thenable<string[]>)的承诺的语法是什么?

这是 vscode 的许多 api 的示例:vscode api

看看 Ionide 是如何做到的:

https://github.com/ionide/ionide-vscode-helpers/blob/fable/Helpers.fs https://github.com/ionide/ionide-vscode-helpers/blob/fable/Fable.Import.VSCode.fs

基本上,Ionide 似乎几乎忽略了 Thenable<T> 的存在,并将每个 API 调用转换为 Fable 绑定中的 Promise<T>。他们在 Helpers.fs, but I don't see those being used anywhere in the entire https://github.com/ionide/ionide-vscode-fsharp 存储库中确实有一对 toPromisetoThenable 函数。

我没有任何使用 Fable 的个人经验,所以如果这还不足以回答您的问题,希望其他人能提供更多信息。

在尝试了一些语法之后,我能够通过 rmunn 提供的将 Thenable 转换为 Promise 的线索弄清楚。

module PromiseUtils =
  let success (a : 'T -> 'R) (pr : Promise<'T>) : Promise<'R> =
      pr?``then`` (unbox a) |> unbox

  let toPromise (a : Thenable<'T>) = a |> unbox<Promise<'T>>

  let toThenable (a : Promise<'T>) = a |> unbox<Thenable<'T>>

使用上面的实用程序模块,我能够将 return Thenable 的函数转换为 Promises,这样它们就可以被重新调用。

  let result = commands.getCommands ()
               |> PromiseUtils.toPromise
               |> PromiseUtils.success (fun item -> 
                  let firstOne = item.Item 1
                  console.log(firstOne))