【问题标题】:How to create an "encapsulated"/"existential" type within a JavaScript Flow Interface如何在 JavaScript 流接口中创建“封装”/“存在”类型
【发布时间】:2018-01-23 18:58:45
【问题描述】:

我有一个带有类型变量cursor 的接口,它只与接口中的方法相关:

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

当我实现这个接口时,实现类选择cursor应该是什么。

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

这个类的用户将获得游标类型,但他们只能使用其上的接口方法,出于意图和目的,它是一个不透明的类型。

但是,当我想使用与任何 OrderIndexI&lt;*&gt; 一起工作的通用函数时,上述方法不起作用,而确切的光标类型并不重要。

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

我发现它只能这样做:

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

但我认为让这成为一种选择是没有意义的。用户应该有某种方式不明确表示他们可以使用“任何”cursor,因为cursor 总是只打算由接口方法使用。有没有办法“隐藏”cursor,所以当用户想要使用OrderIndexI 时没有明确指定它。

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

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

【问题讨论】:

    标签: javascript flowtype


    【解决方案1】:

    只需将genericWork 函数定义为generic

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

    【讨论】:

    • 我更多的是要求 T 应该完全隐藏。与在 Haskell 中一样,存在类型是未知的,甚至根本不被提及。
    • 消费者没有明确指定类型,推断为:takeThis(oi1);
    猜你喜欢
    • 2017-06-02
    • 2020-05-29
    • 2016-12-03
    • 2017-01-07
    • 2013-09-14
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 2019-09-27
    相关资源
    最近更新 更多