簡體   English   中英

如何在類型參數中使用展開的多態變體 [聯合類型]?

[英]How do I use an unwrapped polymorphic variant [union type] in a type parameter?

目標:綁定到Service Worker 緩存

我正在編寫一個綁定,讓我在 ReScript 中編寫 Service Worker。 字符串 URL 和Request有時可以互換使用。

在可能的情況下,我會避免 JS output 中的噪音。

我對[@bs.unwrap]的了解

我知道我可以像這樣使用[@bs.unwrap]add方法之類的東西編寫綁定

[@bs.send]
  external add: (cache, [@bs.unwrap] [ `Request(Request.t) | `String(string)])
  => Js.Promise.t(unit) = "add";

這是一個簡單的用法。

問題:與請求和/或字符串數array綁定

但是, addAll方法具有更復雜的類型簽名。 它需要一個對象數組,可以是數組或請求,也可以是字符串數組或同時具有這兩種類型的項的數組。

但據我所知,您不能在類型參數中拆箱類型,例如

[@bs.send]
  external addAll: (cache,
   array([@bs.unwrap] [ `Request(Request.t) | `String(string)])
  => Js.Promise.t(unit) = "addAll";

問題:這種綁定是否可能與 ReScript 中的 model 綁定?

當然,放棄字符串大小寫並使用 Requests 或編寫兩個單獨的綁定並假設我不需要同時具有兩者的數組是合理的。

但現在我只是好奇:有沒有辦法在 ReScript 中輸入這種類型的綁定?

您可以使用抽象類型和一組轉換函數將值“轉換”為該類型,而不是多態變體:

module Value = {
  type t;
  external request: Request.t => t = "%identity";
  external str: string => t = "%identity";
};

[@bs.send]
  external addAll: (cache, array(Value.t)) => Js.Promise.t(unit) = "addAll";

示例用法:

addAll(cache, [|
  Value.request(req),
  Value.str("foo"),
|])

或為簡潔起見使用本地開放:

addAll(cache, Value.[|
  request(req),
  str("foo"),
|])

這就是Js.Json編碼器的工作原理,如果您想知道的話。 而且由於Js.Json也有解碼器,你知道如果你需要的話,也可以用其他方式 go 。 這樣做有點復雜,並且取決於已經抽象出來的底層類型。

順便說一句,這是從我的 BuckleScript 食譜中摘錄的,它還有很多其他的食譜,在這種棘手的情況下可能會派上用場。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM