我有以下设置:
/* @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
。