如何将非通用映射分配给流类型的通用映射
how do you assign a non-generic Map to a generic Map in flow type
我正在尝试将非通用地图分配给通用地图,但流程抱怨该值不兼容。有没有办法解决。查看下面示例中的 m4
和 m5
。
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]
这是失败的,因为这样做是有效的
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)
我正在尝试将非通用地图分配给通用地图,但流程抱怨该值不兼容。有没有办法解决。查看下面示例中的 m4
和 m5
。
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]
这是失败的,因为这样做是有效的
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)