我有一个带有类型变量 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
时并没有明确指定.
在 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/