Ответы @elderapo и @Andrew были полезны.
Ответ @ elderapo наиболее прямо ответил на мой первоначальный запрос: «почему машинопись не жалуется на вызов функции, а жалуется на обратный вызов? ":
Значение состояния может измениться где-то между обратным вызовом if check и complate
И @Andrew обратил внимание на основную проблему, используя null в качестве допустимого значение в этом случае, вероятно, небезопасно.
Я настоятельно рекомендую вам всегда учитывать нулевое значение. Концепция null была сочтена ошибкой, и отсутствие защиты от этого значения делает ваш код небезопасным
Хотя я не ожидаю, что значения db
и remoteDb
вернутся к нулю между отправкой действия и обратным вызовом лучше вообще исключить эту возможность. Отсутствие соединения / потеря соединения с базой данных обрабатываются в другом коде.
Вместо того, чтобы разрешить типу быть null
просто для инициализации, я теперь инициализирую их как пустые объекты с приведением типа. Поэтому мне не нужно отключать strictNullChecks (я хочу их).
Новый код:
export interface DatabaseState {
db: PouchDB.Database;
remoteDb: PouchDB.Database;
dbReplication: PouchDB.Replication.Sync<{}>;
dbSyncStatus: number;
dbSyncInfo: string;
dbSyncError: string;
}
const state: DatabaseState = {
db: {} as PouchDB.Database,
remoteDb: {} as PouchDB.Database,
dbReplication: {} as PouchDB.Replication.Sync<{}>,
dbSyncStatus: SyncStatus.NONE,
dbSyncInfo: "",
dbSyncError: ""
};
async startDatabaseSyncronisation({ state, commit, dispatch }) {
var opts = { live: true, retry: true };
await PouchDB.replicate(state.remoteDb, state.db, opts).on(
"complete",
function(info) {
let replication = PouchDB.sync(state.remoteDb, state.db, opts)
.on("paused", function(err: {}) {
dispatch("onSyncPaused", err);
})
.on("active", function() {
dispatch("onSyncActive");
})
.on("denied", function(err: {}) {
dispatch("onSyncError", err);
})
.on("error", function(err: {}) {
dispatch("onSyncError", err);
})
.on("complete", function() {});
commit(SET_DB_REPLICATION, replication);
}
);
},