我正在尝试将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)
,但是在这种情况下,流量覆盖范围将不完整(抱怨any
)。 最佳答案
为了使这项工作有效,您必须向Flow证明value
确实具有类型T
。
首先,您的实现显然不适用于所有可能的T
。原型呢?不可枚举的属性呢?那么诸如Date
,RegExp
之类的内置函数呢?
公平地讲,即使您将实现克隆的所有细节,Flow也无法看到,这太复杂了。
当您想利用Java脚本的动态性时,您很可能不得不放弃类型安全性来实现。