我有兴趣将我的 Flow 代码切换到 strict 类型检查,但我有一些一般处理对象的低级实用程序函数,例如:
// @flow strict
const hasKey = (o: Object): (string => boolean) =>
Object.prototype.hasOwnProperty.bind(o);
const union = (os: Array<Object>): Object =>
os.reduceRight((acc, o) => ({ ...acc, ...o }), {});
由于严格模式下不允许使用 Object 类型,如何为明确应该对任何泛型 Object 进行操作的函数声明类型?
最佳答案
在这种情况下,您实际上会从更严格的输入中受益匪浅。通过使用 Object您实际上是在为通过这些函数的所有数据关闭输入系统关闭,直到它们可以在其他地方显式地重新输入。这意味着您目前正在丢失大量不需要的输入信息。
这是一个关于泛型的教科书案例,记录在 here .
// @flow strict
const hasKey = <T: {}>(o: T): (string => boolean) =>
Object.prototype.hasOwnProperty.bind(o);
const union = <T: {}>(objects: Array<T>): T =>
objects.reduce((acc, o) => ({ ...acc, ...o }), ({}: $Shape<T>));
上面最重要的部分是: {}在 <T: {}> .这些是类型边界。如果泛型是一种说法,“允许用户传递他们想要的任何类型,并将该类型存储在变量中以便我以后可以引用它”,那么type bounds 表示“允许用户传递他们想要的任何类型,只要该类型是 X 类型的成员。”
因为方式width subtyping作品, {}是最通用的对象类型。实际上所有对象都是 {} 的子类型.所以<T: {}>基本上意味着,“T 应该是任何类型的对象。”
请注意,这与 <T: Object> 非常不同。 ,这基本上意味着,“T 是一个对象,从现在开始我不会检查它的任何其他内容。”这意味着我们可以执行以下操作:
const o: Object = {};
console.log(o.some.member.that.doesnt.exist); // no error at compile time,
// but obvious error at runtime
不同于:
const o: {} = {};
console.log(o.member); // Error, we don't know about this member property!
所以通过告诉 flow 参数是 {} 的子类型,我们告诉它它具有对象的基本 API。它具有属性,可以是休息和展开,可以是字符串索引等,但仅此而已。此外,通过将数据类型存储为通用 T并返回该类型,我们正在维护参数的类型信息。这意味着无论我们作为参数传入什么,我们都会从另一边得到相同类型的东西(而不是一个神秘的黑匣子)。
关于javascript - 在@flow strict 下,对于实用功能,Object 有哪些替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53322524/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我想用ruby编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
“输出”是一个序列化的OpenStruct。定义标题try(:output).try(:data).try(:title)结束什么会更好?:) 最佳答案 或者只是这样:deftitleoutput.data.titlerescuenilend 关于ruby-on-rails-更好的替代方法try(:output).try(:data).try(:name)?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.c
只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您
您认为可以作为插件很好地存在于您的Rails应用程序中必须实现的哪些行为?您过去曾搜索过哪些插件功能但找不到?哪些现有的Rails插件可以改进或扩展,如何改进或扩展? 最佳答案 我希望在管理界面中看到一个引擎插件,它提供了应用程序中所有模型的仪表板摘要,以及可配置的事件图表。 关于ruby-on-rails-您希望看到哪些Rails插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questio
我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的
我正在使用DMOZ的listofurltopics,其中包含一些具有包含下划线的主机名的url。例如:608609TheOuterHeaven610InformationandimagegalleryofMcFarlane'sactionfiguresforTrigun,Akira,TenchiMuyoandotherJapaneseSci-Fianimations.611Top/Arts/Animation/Anime/Collectibles/Models_and_Figures/Action_Figures612虽然此url可以在网络浏览器中使用(或者至少在我的浏览器中可以使用: