如何对克隆函数进行流注释?
How do I flow-annotate a clone function?
我正在尝试将 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 来指示 return 类型将与输入类型相同。但是,Flow return 出现以下错误:
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 知道 returned 类型 T 将是一个对象 — 为什么它不能与对象文字兼容?如果不能,我该如何正确注释?
我可以在这个分支中添加(value: any)
,但是在这种情况下Flow覆盖率不会满(抱怨any
)。
要完成这项工作,您必须向 Flow 证明 value
确实具有类型 T
。
首先,您的实施显然不适用于所有可能的 T
。原型呢?不可枚举的属性呢? Date
、RegExp
等内置函数呢?
公平地说,即使您将克隆的每一个可能细节都实现,Flow 也看不到它,它太复杂了。
当你想利用 Javascript 的动态性时,你很可能不得不放弃类型安全来实现。
我正在尝试将 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 来指示 return 类型将与输入类型相同。但是,Flow return 出现以下错误:
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 知道 returned 类型 T 将是一个对象 — 为什么它不能与对象文字兼容?如果不能,我该如何正确注释?
我可以在这个分支中添加(value: any)
,但是在这种情况下Flow覆盖率不会满(抱怨any
)。
要完成这项工作,您必须向 Flow 证明 value
确实具有类型 T
。
首先,您的实施显然不适用于所有可能的 T
。原型呢?不可枚举的属性呢? Date
、RegExp
等内置函数呢?
公平地说,即使您将克隆的每一个可能细节都实现,Flow 也看不到它,它太复杂了。
当你想利用 Javascript 的动态性时,你很可能不得不放弃类型安全来实现。