У меня есть универсальный класс, который может быть экземпляром двух разных классов.В конструкторе пользователь класса должен передать тип экземпляра для использования, затем в объекте карты я использую этот тип для получения соответствующего класса.
Несмотря на расширенную типизацию, поток продолжает жаловаться, что я могу 't сохранить экземпляр, потому что экземпляр X не совместим с экземпляром Y.
Пожалуйста, посмотрите это repro
type BrowserHistoryInstance = {|
+foo: (number) => number
|};
type MemoryHistoryInstance = {|
+bar: (number) => number
|};
const historyTypeMaps = Object.freeze({
memory : (({}: any): MemoryHistoryInstance),
browser : (({}: any): BrowserHistoryInstance)
});
class History <InstanceType: $Keys<typeof historyTypeMaps>> {
instance: $ElementType<typeof historyTypeMaps, InstanceType>;
constructor(type: InstanceType) {
this.instance = historyTypeMaps[type];
}
}
Ошибка:
this.instance = historyTypeMaps[type];
^ Cannot assign `historyTypeMaps[type]` to `this.instance` because property `memo` is missing
in `BrowserHistoryInstance` [1] but exists in `MemoryHistoryInstance` [2].
References:
browser : (({}: any): BrowserHistoryInstance)
^ [1]
memory : (({}: any): MemoryHistoryInstance),
^ [2]