解决流程类型错误

Resolving Flow type errors

我正在编写 Array 的扩展,并尝试将类型检查与 Flow 合并,但出现一个我似乎无法解决的错误。

下面的函数 Sum 有一个可选参数 transformer,如果 transformer 未定义,则给它一个默认值。然后循环遍历数组,如果元素是数字,则应用变换函数并将结果添加到总和。

Flow 发出 "Function cannot be called on possible undefined value" 的警告。我认为检查 transformer 是否已定义并且是一个函数应该可以缓解这种情况?什么是最好的解决方案?

// @flow

export function Sum(transformer : ?(a : number) => number) : number {

    const transformerIsUndefined = typeof(transformer) === "undefined";

    if (!transformerIsUndefined && typeof(transformer) !== "function") {
        throw "Transform argument must be a function";
    }

    if (transformerIsUndefined) {
        transformer = item => item;
    }

    let i : number = 0;
    let sum : number = 0;
    while (i < this.length) {
        if (typeof(this[i]) === "number") {
            sum += transformer(this[i]);
        } else {
            throw "Non-numerical element in the array.";
        }
        i++;
    }
    return sum;
}

我通过将参数更改为必需参数并在函数签名中提供默认值来解决此问题:

export function Sum(transformer : (a : number) => number = item => item) : number {
    ...
}

我仍然对其他方面感兴趣。