如何从Reason更新JS类型数组?

时间:2019-03-16 20:25:50

标签: arrays typed-arrays reason bucklescript typedarray

我正在尝试更新Canvas图像上下文的ImageData,并且当我尝试在数据数组中设置元素时,我收到一条错误消息,表示在预期{{1}时该数组的类型为.gradient { align-items: flex-end; display: flex; flex-basis: 0; flex-grow: 1; background: linear-gradient(to right, rgba(195, 32, 52, 0.83) 0%, rgba(36, 11, 54, 0.83) 100%); width: 300px; height: 300px; .image { align-items: flex-end; background-image: url(https://huish.landoncall.com/wp-content/uploads/2019/03/emily-jacobsen.jpg); background-size: cover; display: flex; height: 100%; width: 100%; h2 { color: white; display: none; padding-left: 20px; } &:hover { opacity: 0.2; transition: opacity ease-in 0.7s; h2 { display: initial; } } } } }。

为什么我不能更新JS TypedArray实现?

这是我的组件代码(为清晰起见,进行了一些简化):

Js.Typed_array.Uint8ClampedArray.t

1 个答案:

答案 0 :(得分:3)

对于编译器来说,array('a)Js.Typed_array.Uint8ClampedArray.t的类型不同,因此它们的操作(包括索引编制)不可互换。这与不能添加int和float的原理相同。

要设置类型化数组元素,您需要查找(或编写)绑定,使您可以显式地执行此操作,而不是使用索引运算符。为此,您可以查看Js.Typed_array模块-有一个module type S,我们可以说这意味着“所有类型的数组模块都必须符合此模块签名”。包括Js.Typed_array.Uint8ClampedArray模块。因此,您可以使用S模块类型的unsafe_set函数来设置类型化数组元素,因为Js.Typed_array.Uint8ClampedArray实现了它:

let module UI8s = Js.Typed_array.Uint8ClampedArray;
UI8s.unsafe_set(data, index, r);
UI8s.unsafe_set(data, index + 1, g);
UI8s.unsafe_set(data, index + 2, b);
UI8s.unsafe_set(data, index + 3, 0);