gpt4 book ai didi

javascript - 模块名称隐藏了绑定(bind)中使用的全局名称

转载 作者:行者123 更新时间:2023-11-30 19:47:43 25 4
gpt4 key购买 nike

tl;dr: 如何更改以下绑定(bind)以编写 Intl.DateTimeFormat.make() 而不是 Intl_.DateTimeFormat.make( )?

type dateTimeFormat;

[@bs.deriving abstract]
type formatOptions = {
[@bs.optional]
weekday: string,
[@bs.optional]
day: string,
[@bs.optional]
month: string,
};

module Intl_ {
module DateTimeFormat {
module Impl {
type t;
};

[@bs.new] external make: unit => Impl.t = "Intl.DateTimeFormat";
[@bs.send] external format: (Impl.t, Js.Date.t) => string = "";
};
}

Intl_.DateTimeFormat.make()
->Intl_.DateTimeFormat.format(Js.Date.make())
->Js.log;

问题

如果没有下划线,这将编译为:

var Impl = /* module */[];

var DateTimeFormat = /* module */[/* Impl */Impl];

var Intl = /* module */[/* DateTimeFormat */DateTimeFormat];

console.log(new Intl.DateTimeFormat().format(new Date()));

exports.Intl = Intl;

问题是 var Intl = ... 隐藏了全局 Intl,因此破坏了 new Intl.DateTimeFormat()

最佳答案

首先,我认为这是 BuckleScript 中的一个错误。此问题最近在 issue #3268 中提出并在 this commit 中部分解决,但它仍然保留了许多名称。您应该考虑在那里或在新问题中提出这个问题。

与此同时,您可以通过完全限定名称来解决这个问题。 Intl 实际上不是一个全局对象,而是附加到 全局对象,在网页的上下文中是 window。但由于 JavaScript 会在本地环境中找不到全局对象时查找名称,因此它看起来很像全局名称。

因此,如果您将 make 更改为:

[@bs.new] external make: unit => Impl.t = "window.Intl.DateTimeFormat";

它应该可以正常工作。

关于javascript - 模块名称隐藏了绑定(bind)中使用的全局名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54803396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com