我正在尝试将Flow注释添加到简单的克隆功能中,目前看起来不可能。这是一次尝试:
// @flow
var clone = function<T>(obj: T): T {
if (Array.isArray(obj)) {
return obj.map(clone);
}
if (obj && typeof obj === 'object') {
var value = {};
for (var i in obj) {
value[i] = clone(obj[i]);
}
return value;
}
return obj;
}
我使用泛型类型T来表示返回类型与输入类型相同。但是,Flow返回以下错误:
11: return value;
^^^^^ object literal. This type is incompatible with the expected return type of
2: var clone = function<T>(obj: T): T {
^ some incompatible instantiation of `T`
在目标代码分支上,Flow知道返回的类型T将是一个对象 - 为什么它不能与对象文字兼容呢?如果不能,我该如何正确地注释?
我可以在此分支中添加(value: any)
,但在这种情况下Flow覆盖率不会满(抱怨any
)。
答案 0 :(得分:1)
要完成这项工作,您必须向Flow证明value
确实具有T
类型。
首先,您的实施显然不适用于所有可能的T
。原型怎么样?那些不可枚举的属性呢?内置文件怎么样,比如Date
,RegExp
等?
公平地说,即使您将在每个可能的细节上实现克隆,Flow也无法看到它,它太复杂了。
当你想利用Javascript的动态是这样一种方式时,你很可能不得不放弃类型安全来实现。