如何将非通用映射分配给流类型的通用映射

how do you assign a non-generic Map to a generic Map in flow type

我正在尝试将非通用地图分配给通用地图,但流程抱怨该值不兼容。有没有办法解决。查看下面示例中的 m4m5

interface Person  {
 name: string;
}

type Doctor =  {
  name: string,
  license: string,
}

var d:Doctor = {
  name: 'Sam',
  license: 'PHD'
};
var p: Person = d;

// It is possible to create a generic array where each element 
// implements the interface Person
const a: Array<Person> = [d];

// As a Map, it appears you cannot the value cannot be generic array
let m2: Map<string, Array<Doctor>> = new Map<string, Array<Doctor>> ();
let m3: Map<string, Array<Person>> = m2;


// As a Map, it appears that value cannot be a generic object 
let m4: Map<string, Doctor> = new Map<string, Doctor> ();
m4.set('bob', d);
let m5: Map<string, Person> = m4;

下面语句出错

28: let m5: Map<string, Person> = m4;
                                  ^ Cannot assign `m4` to `m5` because property `license` is missing in `Person` [1] but exists in `Doctor` [2] in type argument `V` [3]. [prop-missing]

Flow

这是失败的,因为这样做是有效的

m5.set("foo", { name: "foo" });

因为这是一个有效的 Person 并且会损坏 m4 因为它不再包含 Doctor 个对象。

为了让您的代码正常工作,您 m5 需要是只读的,并且 m3 需要对只读数组是只读的,例如

let m3: $ReadOnlyMap<string, $ReadOnlyArray<Person>> = m2;

let m5: $ReadOnlyMap<string, Person> = m4;

(Flow Try)