Flow 无法识别在接受回调的回调参数中实现类

  • 本文关键字:回调 参数 实现 识别 Flow flowtype
  • 更新时间 :
  • 英文 :


我有以下设置:

/* @flow */
interface ISelectable {
onSelectUntil(callback: (data : ISelectable) => void, until : (callToRemoveCallback : Function, callback: (data : ISelectable) => void) => void): void;
}
class BaseFileTile implements ISelectable {
onSelectUntil(callback: (data : BaseFileTile) => void, until : (callToRemoveCallback : Function, callback: (data : BaseFileTile) => void) => void) : void {}
}

问题是这会抛出:

7:   onSelectUntil(callback: (data : BaseFileTile) => void, until : (callToRemoveCallback : Function, callback: (data : BaseFileTile) => void) => void) : void {}
                                                  ^ Cannot implement `ISelectable` [1] with `BaseFileTile` because `BaseFileTile` [2] is incompatible with `ISelectable` [3] in the first argument of the second argument of the second argument of property `onSelectUntil`.
References:
6: class BaseFileTile implements ISelectable {
^ [1]
7:   onSelectUntil(callback: (data : BaseFileTile) => void, until : (callToRemoveCallback : Function, callback: (data : BaseFileTile) => void) => void) : void {}
                                                  ^ [2]
3: onSelectUntil(callback: (data : ISelectable) => void, until : (callToRemoveCallback : Function, callback: (data : ISelectable) => void) => void): void;

试试吧

在第一个回调流中正确识别BaseFileTile类型为ISelectable,但在另一个回调中会抛出错误。这种行为是需要的还是错误?

这是预期行为。这必须与callback函数修改其data参数的可能性有关。具体来说,如果回调函数接受ISelectable则它可以以保留其ISelectable类型的任何方式与data进行交互。因此,callback可能会修改一个BaseFileTile,打破它作为BaseFileTile的类型,但保持它作为ISelectable的类型。

若要完成此操作,您需要使用$ReadOnly实用工具类型(Try Flow)将data参数标记为"只读"。这告诉 Flowdata参数不会被修改,因此BaseFileTile将保留为BaseFileTile

最新更新