如何对克隆函数进行流注释?

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。原型呢?不可枚举的属性呢? DateRegExp 等内置函数呢?

公平地说,即使您将克隆的每一个可能细节都实现,Flow 也看不到它,它太复杂了。

当你想利用 Javascript 的动态性时,你很可能不得不放弃类型安全来实现。