首页 > 解决方案 > Flow 无法识别接受回调的回调参数内的实现类

问题描述

我有以下设置:

/* @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;

试试看

虽然在第一个回调中 Flow 正确识别了BaseFileTile它的类型ISelectable,但在另一个回调中抛出了一个错误。这种行为是想要的还是一个错误?

标签: flowtype

解决方案


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

要使这项工作正常进行,您需要使用实用程序类型( Try Flow )将data参数标记为“只读” 。这告诉 Flow不会修改参数,因此 a将保持为 a 。$ReadOnlydataBaseFileTileBaseFileTile


推荐阅读