diff --git a/src/public/app/widgets/type_widgets/options/other/attachment_erasure_timeout.js b/src/public/app/widgets/type_widgets/options/other/attachment_erasure_timeout.ts
similarity index 86%
rename from src/public/app/widgets/type_widgets/options/other/attachment_erasure_timeout.js
rename to src/public/app/widgets/type_widgets/options/other/attachment_erasure_timeout.ts
index 671f7d644..53f968861 100644
--- a/src/public/app/widgets/type_widgets/options/other/attachment_erasure_timeout.js
+++ b/src/public/app/widgets/type_widgets/options/other/attachment_erasure_timeout.ts
@@ -2,6 +2,7 @@ import OptionsWidget from "../options_widget.js";
 import server from "../../../../services/server.js";
 import toastService from "../../../../services/toast.js";
 import { t } from "../../../../services/i18n.js";
+import type { OptionMap } from "../../../../../../services/options_interface.js";
 
 const TPL = `
 
@@ -13,13 +14,17 @@ const TPL = `
         ${t("attachment_erasure_timeout.erase_attachments_after_x_seconds")} 
          
     
-    
+
     ${t("attachment_erasure_timeout.manual_erasing_description")}
-    
+
     ${t("attachment_erasure_timeout.erase_unused_attachments_now")} 
 `;
 
 export default class AttachmentErasureTimeoutOptions extends OptionsWidget {
+
+    private $eraseUnusedAttachmentsAfterTimeInSeconds!: JQuery;
+    private $eraseUnusedAttachmentsNowButton!: JQuery;
+
     doRender() {
         this.$widget = $(TPL);
         this.$eraseUnusedAttachmentsAfterTimeInSeconds = this.$widget.find(".erase-unused-attachments-after-time-in-seconds");
@@ -33,7 +38,7 @@ export default class AttachmentErasureTimeoutOptions extends OptionsWidget {
         });
     }
 
-    async optionsLoaded(options) {
+    async optionsLoaded(options: OptionMap) {
         this.$eraseUnusedAttachmentsAfterTimeInSeconds.val(options.eraseUnusedAttachmentsAfterSeconds);
     }
 }
diff --git a/src/public/app/widgets/type_widgets/options/other/html_import_tags.js b/src/public/app/widgets/type_widgets/options/other/html_import_tags.ts
similarity index 91%
rename from src/public/app/widgets/type_widgets/options/other/html_import_tags.js
rename to src/public/app/widgets/type_widgets/options/other/html_import_tags.ts
index efc3eb84f..38ff45fbf 100644
--- a/src/public/app/widgets/type_widgets/options/other/html_import_tags.js
+++ b/src/public/app/widgets/type_widgets/options/other/html_import_tags.ts
@@ -1,5 +1,6 @@
 import OptionsWidget from "../options_widget.js";
 import { t } from "../../../../services/i18n.js";
+import type { OptionMap } from "../../../../../../services/options_interface.js";
 
 // TODO: Deduplicate with src/services/html_sanitizer once there is a commons project between client and server.
 export const DEFAULT_ALLOWED_TAGS = [
@@ -103,12 +104,12 @@ export const DEFAULT_ALLOWED_TAGS = [
 const TPL = `
 
     ${t("import.html_import_tags.title")} 
-    
+
     
${t("import.html_import_tags.description")}
-    
-    
-    
+
     
         
             ${t("import.html_import_tags.reset_button")}
@@ -117,6 +118,10 @@ const TPL = `
  
`;
 
 export default class HtmlImportTagsOptions extends OptionsWidget {
+
+    private $allowedTags!: JQuery
;
+    private $resetButton!: JQuery;
+
     doRender() {
         this.$widget = $(TPL);
         this.contentSized();
@@ -131,7 +136,7 @@ export default class HtmlImportTagsOptions extends OptionsWidget {
         this.refresh();
     }
 
-    async optionsLoaded(options) {
+    async optionsLoaded(options: OptionMap) {
         try {
             if (options.allowedHtmlTags) {
                 const tags = JSON.parse(options.allowedHtmlTags);
@@ -148,7 +153,7 @@ export default class HtmlImportTagsOptions extends OptionsWidget {
     }
 
     async saveTags() {
-        const tagsText = this.$allowedTags.val();
+        const tagsText = String(this.$allowedTags.val()) || "";
         const tags = tagsText
             .split(/[\n,\s]+/) // Split on newlines, commas, or spaces
             .map((tag) => tag.trim())
diff --git a/src/public/app/widgets/type_widgets/options/other/network_connections.js b/src/public/app/widgets/type_widgets/options/other/network_connections.ts
similarity index 81%
rename from src/public/app/widgets/type_widgets/options/other/network_connections.js
rename to src/public/app/widgets/type_widgets/options/other/network_connections.ts
index 33eb5189b..631a8b3ca 100644
--- a/src/public/app/widgets/type_widgets/options/other/network_connections.js
+++ b/src/public/app/widgets/type_widgets/options/other/network_connections.ts
@@ -1,10 +1,11 @@
 import OptionsWidget from "../options_widget.js";
 import { t } from "../../../../services/i18n.js";
+import type { OptionMap } from "../../../../../../services/options_interface.js";
 
 const TPL = `
 
     
${t("network_connections.network_connections_title")} 
-        
+
     
          
         ${t("network_connections.check_for_updates")}
@@ -12,13 +13,16 @@ const TPL = `
  `;
 
 export default class NetworkConnectionsOptions extends OptionsWidget {
+
+    private $checkForUpdates!: JQuery;
+
     doRender() {
         this.$widget = $(TPL);
         this.$checkForUpdates = this.$widget.find(".check-for-updates");
         this.$checkForUpdates.on("change", () => this.updateCheckboxOption("checkForUpdates", this.$checkForUpdates));
     }
 
-    async optionsLoaded(options) {
+    async optionsLoaded(options: OptionMap) {
         this.setCheckboxState(this.$checkForUpdates, options.checkForUpdates);
     }
 }
diff --git a/src/public/app/widgets/type_widgets/options/other/note_erasure_timeout.js b/src/public/app/widgets/type_widgets/options/other/note_erasure_timeout.ts
similarity index 86%
rename from src/public/app/widgets/type_widgets/options/other/note_erasure_timeout.js
rename to src/public/app/widgets/type_widgets/options/other/note_erasure_timeout.ts
index f81735e9c..ee6693f80 100644
--- a/src/public/app/widgets/type_widgets/options/other/note_erasure_timeout.js
+++ b/src/public/app/widgets/type_widgets/options/other/note_erasure_timeout.ts
@@ -2,6 +2,7 @@ import OptionsWidget from "../options_widget.js";
 import server from "../../../../services/server.js";
 import toastService from "../../../../services/toast.js";
 import { t } from "../../../../services/i18n.js";
+import type { OptionMap } from "../../../../../../services/options_interface.js";
 
 const TPL = `
 
@@ -13,13 +14,17 @@ const TPL = `
         ${t("note_erasure_timeout.erase_notes_after_x_seconds")} 
          
     
-    
+
     ${t("note_erasure_timeout.manual_erasing_description")}
-    
+
     ${t("note_erasure_timeout.erase_deleted_notes_now")} 
     `;
 
 export default class NoteErasureTimeoutOptions extends OptionsWidget {
+
+    private $eraseEntitiesAfterTimeInSeconds!: JQuery;
+    private $eraseDeletedNotesButton!: JQuery;
+
     doRender() {
         this.$widget = $(TPL);
         this.$eraseEntitiesAfterTimeInSeconds = this.$widget.find(".erase-entities-after-time-in-seconds");
@@ -33,7 +38,7 @@ export default class NoteErasureTimeoutOptions extends OptionsWidget {
         });
     }
 
-    async optionsLoaded(options) {
+    async optionsLoaded(options: OptionMap) {
         this.$eraseEntitiesAfterTimeInSeconds.val(options.eraseEntitiesAfterTimeInSeconds);
     }
 }
diff --git a/src/public/app/widgets/type_widgets/options/other/revision_snapshots_limit.js b/src/public/app/widgets/type_widgets/options/other/revision_snapshots_limit.ts
similarity index 83%
rename from src/public/app/widgets/type_widgets/options/other/revision_snapshots_limit.js
rename to src/public/app/widgets/type_widgets/options/other/revision_snapshots_limit.ts
index 76c09ac43..7ff133733 100644
--- a/src/public/app/widgets/type_widgets/options/other/revision_snapshots_limit.js
+++ b/src/public/app/widgets/type_widgets/options/other/revision_snapshots_limit.ts
@@ -2,6 +2,7 @@ import OptionsWidget from "../options_widget.js";
 import { t } from "../../../../services/i18n.js";
 import server from "../../../../services/server.js";
 import toastService from "../../../../services/toast.js";
+import type { OptionMap } from "../../../../../../services/options_interface.js";
 
 const TPL = `
 
@@ -19,11 +20,15 @@ const TPL = `
 
`;
 
 export default class RevisionSnapshotsLimitOptions extends OptionsWidget {
+
+    private $revisionSnapshotsNumberLimit!: JQuery;
+    private $eraseExcessRevisionSnapshotsButton!: JQuery;
+
     doRender() {
         this.$widget = $(TPL);
         this.$revisionSnapshotsNumberLimit = this.$widget.find(".revision-snapshot-number-limit");
         this.$revisionSnapshotsNumberLimit.on("change", () => {
-            let revisionSnapshotNumberLimit = this.$revisionSnapshotsNumberLimit.val();
+            let revisionSnapshotNumberLimit = parseInt(String(this.$revisionSnapshotsNumberLimit.val()), 10);
             if (!isNaN(revisionSnapshotNumberLimit) && revisionSnapshotNumberLimit >= -1) {
                 this.updateOption("revisionSnapshotNumberLimit", revisionSnapshotNumberLimit);
             }
@@ -36,7 +41,7 @@ export default class RevisionSnapshotsLimitOptions extends OptionsWidget {
         });
     }
 
-    async optionsLoaded(options) {
+    async optionsLoaded(options: OptionMap) {
         this.$revisionSnapshotsNumberLimit.val(options.revisionSnapshotNumberLimit);
     }
 }
diff --git a/src/public/app/widgets/type_widgets/options/other/revisions_snapshot_interval.js b/src/public/app/widgets/type_widgets/options/other/revisions_snapshot_interval.ts
similarity index 84%
rename from src/public/app/widgets/type_widgets/options/other/revisions_snapshot_interval.js
rename to src/public/app/widgets/type_widgets/options/other/revisions_snapshot_interval.ts
index f3285eb39..11071e018 100644
--- a/src/public/app/widgets/type_widgets/options/other/revisions_snapshot_interval.js
+++ b/src/public/app/widgets/type_widgets/options/other/revisions_snapshot_interval.ts
@@ -1,5 +1,6 @@
 import OptionsWidget from "../options_widget.js";
 import { t } from "../../../../services/i18n.js";
+import type { OptionMap } from "../../../../../../services/options_interface.js";
 
 const TPL = `
 
@@ -14,13 +15,16 @@ const TPL = `
 
`;
 
 export default class RevisionsSnapshotIntervalOptions extends OptionsWidget {
+
+    private $revisionsTimeInterval!: JQuery;
+
     doRender() {
         this.$widget = $(TPL);
         this.$revisionsTimeInterval = this.$widget.find(".revision-snapshot-time-interval-in-seconds");
         this.$revisionsTimeInterval.on("change", () => this.updateOption("revisionSnapshotTimeInterval", this.$revisionsTimeInterval.val()));
     }
 
-    async optionsLoaded(options) {
+    async optionsLoaded(options: OptionMap) {
         this.$revisionsTimeInterval.val(options.revisionSnapshotTimeInterval);
     }
 }
diff --git a/src/public/app/widgets/type_widgets/options/other/search_engine.js b/src/public/app/widgets/type_widgets/options/other/search_engine.ts
similarity index 85%
rename from src/public/app/widgets/type_widgets/options/other/search_engine.js
rename to src/public/app/widgets/type_widgets/options/other/search_engine.ts
index bdbfd7b15..946cbbbde 100644
--- a/src/public/app/widgets/type_widgets/options/other/search_engine.js
+++ b/src/public/app/widgets/type_widgets/options/other/search_engine.ts
@@ -1,13 +1,14 @@
 import OptionsWidget from "../options_widget.js";
 import utils from "../../../../services/utils.js";
 import { t } from "../../../../services/i18n.js";
+import type { OptionMap } from "../../../../../../services/options_interface.js";
 
 const TPL = `
 
     ${t("search_engine.title")} 
-    
+
     
${t("search_engine.custom_search_engine_info")}
-    
+
     
  `;
 
-const SEARCH_ENGINES = {
+const SEARCH_ENGINES: Record = {
     Bing: "https://www.bing.com/search?q={keyword}",
     Baidu: "https://www.baidu.com/s?wd={keyword}",
     DuckDuckGo: "https://duckduckgo.com/?q={keyword}",
@@ -43,6 +44,12 @@ const SEARCH_ENGINES = {
 };
 
 export default class SearchEngineOptions extends OptionsWidget {
+
+    private $form!: JQuery;
+    private $predefinedSearchEngineSelect!: JQuery;
+    private $customSearchEngineName!: JQuery;
+    private $customSearchEngineUrl!: JQuery;
+
     isEnabled() {
         return super.isEnabled() && utils.isElectron();
     }
@@ -56,7 +63,7 @@ export default class SearchEngineOptions extends OptionsWidget {
         this.$customSearchEngineUrl = this.$widget.find(".custom-search-engine-url");
 
         this.$predefinedSearchEngineSelect.on("change", () => {
-            const predefinedSearchEngine = this.$predefinedSearchEngineSelect.val();
+            const predefinedSearchEngine = String(this.$predefinedSearchEngineSelect.val());
             this.$customSearchEngineName[0].value = predefinedSearchEngine;
             this.$customSearchEngineUrl[0].value = SEARCH_ENGINES[predefinedSearchEngine];
         });
@@ -69,7 +76,7 @@ export default class SearchEngineOptions extends OptionsWidget {
         });
     }
 
-    async optionsLoaded(options) {
+    async optionsLoaded(options: OptionMap) {
         this.$predefinedSearchEngineSelect.val("");
         this.$customSearchEngineName[0].value = options.customSearchEngineName;
         this.$customSearchEngineUrl[0].value = options.customSearchEngineUrl;
diff --git a/src/public/app/widgets/type_widgets/options/other/tray.js b/src/public/app/widgets/type_widgets/options/other/tray.ts
similarity index 81%
rename from src/public/app/widgets/type_widgets/options/other/tray.js
rename to src/public/app/widgets/type_widgets/options/other/tray.ts
index 10255ac18..4f8326479 100644
--- a/src/public/app/widgets/type_widgets/options/other/tray.js
+++ b/src/public/app/widgets/type_widgets/options/other/tray.ts
@@ -1,6 +1,7 @@
 import OptionsWidget from "../options_widget.js";
 import { t } from "../../../../services/i18n.js";
 import utils from "../../../../services/utils.js";
+import type { OptionMap } from "../../../../../../services/options_interface.js";
 
 const TPL = `
 
@@ -13,6 +14,9 @@ const TPL = `
 
`;
 
 export default class TrayOptions extends OptionsWidget {
+
+    private $trayEnabled!: JQuery;
+
     doRender() {
         this.$widget = $(TPL);
         this.$trayEnabled = this.$widget.find(".tray-enabled");
@@ -23,7 +27,7 @@ export default class TrayOptions extends OptionsWidget {
         return utils.isElectron();
     }
 
-    async optionsLoaded(options) {
+    async optionsLoaded(options: OptionMap) {
         this.$trayEnabled.prop("checked", options.disableTray !== "true");
     }
 }