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

时间:2016-11-14 16:27:45

标签: javascript flowtype

我正在尝试将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)。

1 个答案:

答案 0 :(得分:1)

要完成这项工作,您必须向Flow证明value确实具有T类型。

首先,您的实施显然不适用于所有可能的T。原型怎么样?那些不可枚举的属性呢?内置文件怎么样,比如DateRegExp等?

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

当你想利用Javascript的动态是这样一种方式时,你很可能不得不放弃类型安全来实现。