流通用类型<t>'与对象类型不兼容'

时间:2018-09-03 09:34:49

标签: javascript generics flowtype

这是我尝试使用泛型注释时遇到的Flow错误的简化示例:

// @flow

function component<T>(state: T) {
    let model = deepFreeze(state);
    //        ^ Cannot call `deepFreeze` with `state` bound to `o` 
    //          because `T` [1] is incompatible with object type [2].

    return {
        update: (state: T) => {
        // etc.
        }
    };
}

function deepFreeze(o: Object) {
    Object.freeze(o);
    // etc.
    return o;
}

在我看来<T>应该简单地跟踪类型,无论它是什么。

在此示例中,我使用了我能找到的最不具体的类型,文档对此进行了说明:“如果您需要选择退出类型检查器,并且不想一直使用任何类型,您可以改为使用对象”。

那么当不可避免地以其他更特定的方式使用多态类型时,如何使用多态类型呢?

1 个答案:

答案 0 :(得分:0)

缩小通用类型可消除错误:

switch

docs

... 泛型具有“未知”类型。您不得将泛型当作特定类型使用。
您可以在通用类型中添加类型...这样,您可以在仅允许使用某些特定类型的情况下保持通用类型的行为。