【问题标题】:Polymorphism and subtypes for Flow arraysFlow 数组的多态性和子类型
【发布时间】:2019-11-09 09:15:11
【问题描述】:

我无法让多态子类型在具有 Flow 泛型的数组中工作,就像在 Java 等另一种语言中那样。

考虑以下内容。

interface Person {
    name:string;
}

class Employee implements Person {
    name:string;
    badge:string;
}

interface Workplace {
    people:Array<Person>;
}

class MyOffice implements Workplace {
    people:Array<Employee>;  // ERROR: Incompatible with Workplace.people
}

这在 Java 中也会失败;但是 Java 有一种方法可以正确实现这一点,方法是指示 Workplace 中的 people 数组将包含 Person 的子类型。

interface Workplace {
    people:Array<? extends Person>; // PSUEDO CODE: This is how Java supports subtypes
}

我无法在 Flow 中找到类似的机制。 Flow 在这里讨论方差:https://flow.org/en/docs/lang/variance/#toc-covariancehttps://flow.org/en/docs/lang/depth-subtyping/

这表明以下应该有效。

interface Workplace {
    people:Array<+Person>;
}

但是这种语法失败了。

Flow 中有没有办法声明一个 Array 协变类型?

【问题讨论】:

    标签: javascript flowtype


    【解决方案1】:

    Flow 的变化需要一些时间来适应。正如您所提到的,核心是如果

    这两个操作将无效
    interface Workplace {
        people:Array<Person>;
    }
    

    按原样允许:

    var workplace: Workplace = new MyOffice();
    
    // Not an `Employee`, can't allow adding to array
    workplace.people.push(new SomeOtherPersonImpl()); 
    
    // Not an `Employee`, can't allow replacing array.
    workplace.people = [new SomeOtherPersonImpl()];
    

    要获得这两个属性,我们需要

    1. people 数组设为只读 ($ReadOnlyArray)。
    2. people 属性设为只读。 (你提到的+

    结合这些,你最终得到:

    interface Workplace {
        +people: $ReadOnlyArray<Person>;
    }
    

    (Flow Try Example)

    【讨论】:

    • 谢谢,很好的回答
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    • 2011-05-05
    • 2012-07-15
    • 2020-12-01
    相关资源
    最近更新 更多