javascript - 如何在 JavaScript 流接口(interface)中创建 "encapsulated"/"existential"类型

标签 javascript flowtype

我有一个带有类型变量 cursor 的接口(interface)仅与接口(interface)内的方法相关:

interface OrderIndexI<cursor> {
  getCursor(): cursor;
  fromCursor(cursor): number;
}

当我实现这个接口(interface)时,实现类选择cursor应该是这样。

class OrderIndex1 implements OrderIndexI<Cursor1> { ... }
class OrderIndex2 implements OrderIndexI<Cursor2> { ... }

此类的用户将获取游标类型,但他们只能使用其上的接口(interface)方法,出于意图和目的,它是一种不透明类型。

但是,当我想使用适用于任何 OrderIndexI<*> 的通用函数时,上述方法不起作用其中确切的光标类型并不重要。

function genericWork (o: OrderIndexI<*>) { ... }

我发现它只能这样做:

function genericWork (o: OrderIndexI<any>) { ... }

但我认为允许这成为一种选择是没有意义的。用户应该有某种方式不明确地说他们可以使用“任何”cursor ,自 cursor始终仅供接口(interface)方法使用。有没有办法“隐藏”cursor所以当用户想使用OrderIndexI时并没有明确指定.

https://flow.org/try/#0JYOwLgpgTgZghgYwgAgPJQCbQJIiwD2wB4EBXKAZwHsoA+ZAbwChlkBzCMAYXOqgAoAlAC5kZSjQDcLZDChUAtjwkDxfEchCkFAI2jSAvkyZgAngAcUyvsgC8jZHB0JRW3dGQHpCADZwKFGiYOHgQ+ACMyMAK5j4QChDggehYULgExNY09MysHNy8NMhCollQjDKsUJzkIA5OLsiRXjJGrHKKZcVqNKWFUBpueuW5rMjVYLVi-QB0DdKsRkYmFlb9AEx2DlgQrtrDnt5+AUGp6WGb0bHxiWDJwWmhhERl6zky+V0lyK8VY+M1KB1BjIHaiZoLTwyDpKfrdfp9FTrQb7DyjKqAuo9KAzHaQpbGGCkEAIMDAKh1MBwADWEAAKgALYCBfhUUQpEIZIgAKloKPcIxkcTAYi2VBmn36QkhEym4phZX4CEEhmMwuQVGAkXsIAgAHdTpywuFpUx1ZrNjr9YbHgR1qbjFTaYzmaytSqTDT6UyKG7kZIgA

在 Haskell 中,这是通过存在类型来解决的。

最佳答案

只需将 genericWork 函数定义为 generic :

function takeThis<T>(o: OrderIndexI<T>): number {
  let c = o.getCursor();
  return o.fromCursor(c);
}

关于javascript - 如何在 JavaScript 流接口(interface)中创建 "encapsulated"/"existential"类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48399024/

相关文章:

reactjs - 将 Flow.js 与 React 复合组件结合使用

flowtype - 是否可以安全地使用切换 FlowType 联合类型(字符串枚举)?

javascript - 文件下载后 iframe onload 不执行?

javascript - 在 React Native 中使用流为无状态功能组件定义 Prop 类型

javascript - 显式调用 extJS 类的 initComponent

javascript - 自动调谐/Python/Javascript

javascript - 如何使用/定义具有流类型检查的枚举?

javascript - 如何注释作为对象属性的函数?

javascript - 用户指定的下载位置

javascript - 如何使用导航器而不是 window.webkitStorageInfo HTML5 文件系统 API?