我想定义一个实体映射,使得键必须始终是某个指定类型的其他对象的ID。期望使用会是这样的:使用FlowType键入特定ID
export type Id<T> = {
id: string
};
export type Foo = Id<Foo> & {
val: number
};
// type Foo is now {id: Id<Foo>, val: number}
export type Bar = Id<Bar> & {
val: number
};
// type Bar is now {id: Id<Bar>, val: number}
// FooMap should only be able to store objects of type foo, referenced by
// IDs of type Id<Foo>
export type FooMap = {
[key: Id<Foo>]: Foo
};
const foo1: Foo = { id: "foo1", val: 1 };
const foo2: Foo = { id: "foo2", val: 2 };
const bar1: Bar = { id: "bar1", val: 3 };
// This would pass type checking:
const fooMap: FooMap = {
[foo1.id]: foo1,
[foo2.id]: foo2
};
// But this would fail type checking:
const badMap: FooMap = {
[bar1.id]: foo1
};
我使用的情况是,我想有通过ID的管理关系的规范化对象结构。但是由于这些ID都是相同的底层类型(例如,string
或number
),所以可能会意外编写类似上面的badMap
示例的代码。我希望FlowType可以帮助防止这种情况,只要我以编程方式构造我的地图时,我只会引用正确的ID类型。
是的,你的答案是只是我在我的思想结束了在那里。我同意我的原始用例目前在Flow中似乎不可行,并且进一步同意在声明站点而不是使用站点的错误报告具有误导性。 :)感谢您花时间将示例代码放在一起! – Palpatim