我想定義一個實體映射,使得鍵必須始終是某個指定類型的其他對象的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