diff --git a/packages/loot-core/src/shared/async.ts b/packages/loot-core/src/shared/async.ts
index 70cf5150d603aa8c4a4f826dfc7eeae0f9a5854c..13ad731dc08d3821d9dc36c5ec17972c749b7c07 100644
--- a/packages/loot-core/src/shared/async.ts
+++ b/packages/loot-core/src/shared/async.ts
@@ -4,24 +4,25 @@ import { type HandlerFunctions } from '../types/handlers';
 export function sequential<T extends HandlerFunctions>(
   fn: T,
 ): (...args: Parameters<T>) => Promise<Awaited<ReturnType<T>>> {
-  const sequenceState = {
+  const sequenceState: {
+    running: Promise<Awaited<ReturnType<T>>> | null;
+    queue: Array<{ args: Parameters<T>; resolve; reject }>;
+  } = {
     running: null,
     queue: [],
   };
 
   function pump() {
-    if (sequenceState.queue.length > 0) {
-      const next = sequenceState.queue.shift();
+    const next = sequenceState.queue.shift();
+    if (next !== undefined) {
       run(next.args, next.resolve, next.reject);
     } else {
       sequenceState.running = null;
     }
   }
 
-  function run(args, resolve, reject) {
-    sequenceState.running = fn.apply(null, args);
-
-    sequenceState.running.then(
+  function run(args: Parameters<T>, resolve, reject) {
+    sequenceState.running = fn.apply(null, args).then(
       val => {
         pump();
         resolve(val);
@@ -48,9 +49,9 @@ export function sequential<T extends HandlerFunctions>(
 
 export function once<T extends HandlerFunctions>(
   fn: T,
-): (...args: Parameters<T>) => Promise<Awaited<ReturnType<T>>> {
-  let promise = null;
-  return (...args) => {
+): (...args: Parameters<T>) => Promise<Awaited<ReturnType<T>>> | null {
+  let promise: Promise<Awaited<ReturnType<T>>> | null = null;
+  return (...args: Parameters<T>) => {
     if (!promise) {
       promise = fn.apply(null, args).finally(() => {
         promise = null;
diff --git a/packages/loot-core/src/shared/months.ts b/packages/loot-core/src/shared/months.ts
index a481e0a038f83834fed8f41ce93eda8c6cd0cd48..5655104eae971e659f0ee4cd4b6fb5a0767336fc 100644
--- a/packages/loot-core/src/shared/months.ts
+++ b/packages/loot-core/src/shared/months.ts
@@ -183,7 +183,7 @@ export function _range(
   end: DateLike,
   inclusive = false,
 ): string[] {
-  const months = [];
+  const months: string[] = [];
   let month = monthFromDate(start);
   while (d.isBefore(_parse(month), _parse(end))) {
     months.push(month);
@@ -210,15 +210,15 @@ export function _dayRange(
   end: DateLike,
   inclusive = false,
 ): string[] {
-  const days = [];
+  const days: string[] = [];
   let day = start;
   while (d.isBefore(_parse(day), _parse(end))) {
-    days.push(day);
+    days.push(dayFromDate(day));
     day = addDays(day, 1);
   }
 
   if (inclusive) {
-    days.push(day);
+    days.push(dayFromDate(day));
   }
 
   return days;
diff --git a/packages/loot-core/src/shared/query.ts b/packages/loot-core/src/shared/query.ts
index bf5dd06eeeb15bf52a20071d2779e6fda44538e9..0dd129b586b62ee3a4c63ddcde8a177f6e17237c 100644
--- a/packages/loot-core/src/shared/query.ts
+++ b/packages/loot-core/src/shared/query.ts
@@ -1,6 +1,6 @@
 // @ts-strict-ignore
 export type QueryState = {
-  filterExpressions: Array<unknown>;
+  filterExpressions: Array<string>;
   selectExpressions: Array<unknown>;
   groupExpressions: Array<unknown>;
   orderExpressions: Array<unknown>;
diff --git a/packages/loot-core/src/shared/schedules.ts b/packages/loot-core/src/shared/schedules.ts
index 23dbd9c4e8d0e4499c104d8f636878d36ba370aa..fa711d5c34e4d56832dc0cbb556463239118dd73 100644
--- a/packages/loot-core/src/shared/schedules.ts
+++ b/packages/loot-core/src/shared/schedules.ts
@@ -4,7 +4,11 @@ import type { IRuleOptions } from '@rschedule/core';
 import * as monthUtils from './months';
 import { q } from './query';
 
-export function getStatus(nextDate, completed, hasTrans) {
+export function getStatus(
+  nextDate: string,
+  completed: boolean,
+  hasTrans: boolean,
+) {
   const today = monthUtils.currentDay();
 
   if (completed) {
@@ -45,7 +49,7 @@ export function getHasTransactionsQuery(schedules) {
     .select(['schedule', 'date']);
 }
 
-function makeNumberSuffix(num) {
+function makeNumberSuffix(num: number) {
   // Slight abuse of date-fns to turn a number like "1" into the full
   // form "1st" but formatting a date with that number
   return monthUtils.format(new Date(2020, 0, num, 12), 'do');
@@ -128,7 +132,7 @@ export function getRecurringDescription(config, dateFormat) {
 
         desc += ' on the ';
 
-        const strs = [];
+        const strs: string[] = [];
 
         const uniqueDays = new Set(patterns.map(p => p.type));
         const isSameDay = uniqueDays.size === 1 && !uniqueDays.has('day');
diff --git a/packages/loot-core/src/shared/test-helpers.ts b/packages/loot-core/src/shared/test-helpers.ts
index ec73e05230a4a4743d9006ad7ceaf7fcf3f6fe87..fbdf98896e367a63a54291652da7ae8558e0bff2 100644
--- a/packages/loot-core/src/shared/test-helpers.ts
+++ b/packages/loot-core/src/shared/test-helpers.ts
@@ -1,9 +1,8 @@
-// @ts-strict-ignore
-export let tracer = null;
+export let tracer: null | ReturnType<typeof execTracer> = null;
 
-function timeout(promise, n) {
-  let resolve;
-  const timeoutPromise = new Promise(_ => (resolve = _));
+function timeout<T extends Promise<unknown>>(promise: T, n: number) {
+  let resolve: (response: string) => void;
+  const timeoutPromise = new Promise<string>(_ => (resolve = _));
   const timer = setTimeout(() => resolve(`timeout(${n})`), n);
 
   return Promise.race([
@@ -19,16 +18,20 @@ export function resetTracer() {
   tracer = execTracer();
 }
 
-export function execTracer() {
-  const queue = [];
+export function execTracer<T>() {
+  const queue: Array<{ name: string; data?: T }> = [];
   let hasStarted = false;
-  let waitingFor = null;
+  let waitingFor: null | {
+    name: string;
+    reject: (error: Error) => void;
+    resolve: (data?: T) => void;
+  } = null;
   let ended = false;
 
   const log = false;
 
   return {
-    event(name: string, data?: unknown) {
+    event(name: string, data?: T) {
       if (!hasStarted) {
         return;
       } else if (log) {
@@ -57,7 +60,7 @@ export function execTracer() {
       }
     },
 
-    wait(name) {
+    wait(name: string) {
       if (waitingFor) {
         throw new Error(
           `Already waiting for ${waitingFor.name}, cannot wait for multiple events`,
@@ -69,18 +72,22 @@ export function execTracer() {
       });
     },
 
-    expectWait(name, data) {
+    expectWait(name: string, data?: T) {
       if (!hasStarted) {
         throw new Error(`Expected “${name}” but tracer hasn’t started yet`);
       } else if (log) {
         console.log(`--- expectWait(${name}) ---`);
       }
 
-      let promise = this.wait(name);
+      const promise = this.wait(name);
       if (data === undefined) {
         // We want to ignore the result
-        promise = promise.then(() => true);
-        data = true;
+        return expect(
+          timeout(
+            promise.then(() => true),
+            1000,
+          ),
+        ).resolves.toEqual(true);
       }
 
       if (typeof data === 'function') {
@@ -97,20 +104,20 @@ export function execTracer() {
       }
     },
 
-    expectNow(name, data) {
+    expectNow(name: string, data?: T) {
       if (!hasStarted) {
         throw new Error(`Expected “${name}” but tracer hasn’t started yet`);
       } else if (log) {
         console.log(`--- expectNow(${name}) ---`);
       }
 
-      if (queue.length === 0) {
+      const entry = queue.shift();
+
+      if (!entry) {
         throw new Error(
           `Expected event “${name}” but none found - has it happened yet?`,
         );
-      } else if (queue[0].name === name) {
-        const entry = queue.shift();
-
+      } else if (entry.name === name) {
         if (typeof data === 'function') {
           data(entry.data);
         } else {
@@ -123,7 +130,7 @@ export function execTracer() {
       }
     },
 
-    expect(name: string, data?: unknown) {
+    expect(name: string, data?: T) {
       if (queue.length === 0) {
         return this.expectWait(name, data);
       }
diff --git a/upcoming-release-notes/2228.md b/upcoming-release-notes/2228.md
new file mode 100644
index 0000000000000000000000000000000000000000..e12eb6fb1f7ff8b2ca4aad7683fb4644dc5fde32
--- /dev/null
+++ b/upcoming-release-notes/2228.md
@@ -0,0 +1,6 @@
+---
+category: Maintenance
+authors: [MatissJanis]
+---
+
+TypeScript: fix some `strictNullChecks: true` issues (pt.2)