Полиморфизм и подтипы для массивов потока - PullRequest
0 голосов
/ 08 ноября 2019

Я не могу заставить полиморфные подтипы работать в массивах с обобщениями 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 есть способ реализовать это правильно, указав, что массив people в Workplace будет содержать подтипы Person.

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

Мне не удалось найти сопоставимый механизм в Flow. Поток обсуждает дисперсию здесь: https://flow.org/en/docs/lang/variance/#toc-covariance и https://flow.org/en/docs/lang/depth-subtyping/

Что говорит о том, что должно работать следующее:

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

Но этот синтаксис не работает.

Есть ли способ в Flow объявить ковариантный тип Array?

1 Ответ

1 голос
/ 09 ноября 2019

Дисперсия в потоке требует некоторого привыкания. Главное, как вы упомянули, состоит в том, что эти две операции были бы недействительными, если бы

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 * )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...