Add eslint rule @typescript-eslint/no-unnecessary-type-assertion

And fix all files accordingly.

Release-Notes: skip
Change-Id: I5a151b1d5399aabfe1550f5323e96a452f47cc7f
diff --git a/polygerrit-ui/app/.eslintrc.js b/polygerrit-ui/app/.eslintrc.js
index a4dcb64..e38d558 100644
--- a/polygerrit-ui/app/.eslintrc.js
+++ b/polygerrit-ui/app/.eslintrc.js
@@ -307,6 +307,7 @@
         '@typescript-eslint/ban-ts-comment': 'off',
         // The following rules is required to match internal google rules
         '@typescript-eslint/restrict-plus-operands': 'error',
+        '@typescript-eslint/no-unnecessary-type-assertion': 'error',
         '@typescript-eslint/no-unused-vars': [
           'error',
           {argsIgnorePattern: '^_'},
diff --git a/polygerrit-ui/app/elements/admin/gr-group/gr-group.ts b/polygerrit-ui/app/elements/admin/gr-group/gr-group.ts
index 6054d9c..19e7aa4 100644
--- a/polygerrit-ui/app/elements/admin/gr-group/gr-group.ts
+++ b/polygerrit-ui/app/elements/admin/gr-group/gr-group.ts
@@ -493,7 +493,7 @@
     // Because the value for e.detail.value is a string
     // we convert the value to a boolean.
     const value = e.detail.value === 'true' ? true : false;
-    this.groupConfig!.options!.visible_to_all = value;
+    this.groupConfig.options!.visible_to_all = value;
     this.requestUpdate();
   }
 }
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-dashboards/gr-repo-dashboards_test.ts b/polygerrit-ui/app/elements/admin/gr-repo-dashboards/gr-repo-dashboards_test.ts
index a54eafb..7c26909 100644
--- a/polygerrit-ui/app/elements/admin/gr-repo-dashboards/gr-repo-dashboards_test.ts
+++ b/polygerrit-ui/app/elements/admin/gr-repo-dashboards/gr-repo-dashboards_test.ts
@@ -115,9 +115,9 @@
       );
 
       const dashboard = element._dashboards!;
-      assert.equal(dashboard.length!, 2);
-      assert.equal(dashboard[0].section!, 'custom');
-      assert.equal(dashboard[1].section!, 'default');
+      assert.equal(dashboard.length, 2);
+      assert.equal(dashboard[0].section, 'custom');
+      assert.equal(dashboard[1].section, 'default');
 
       const dashboards = dashboard[0].dashboards;
       assert.equal(dashboards.length, 2);
@@ -148,6 +148,7 @@
     test('fires page-error', async () => {
       const response = {status: 404} as Response;
       stubRestApi('getRepoDashboards').callsFake((_repo, errFn) => {
+        // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
         errFn!(response);
         return Promise.resolve([]);
       });
diff --git a/polygerrit-ui/app/elements/admin/gr-repo/gr-repo.ts b/polygerrit-ui/app/elements/admin/gr-repo/gr-repo.ts
index a3f7374..06691d7 100644
--- a/polygerrit-ui/app/elements/admin/gr-repo/gr-repo.ts
+++ b/polygerrit-ui/app/elements/admin/gr-repo/gr-repo.ts
@@ -811,7 +811,7 @@
         config.submit_type = config.default_submit_type.configured_value;
       }
       if (!config.state) {
-        config.state = STATES.active.value as ProjectState;
+        config.state = STATES.active.value;
       }
       // To properly check if the config has changed we need it to be a string
       // as it's converted to a string in the input.
@@ -1105,7 +1105,7 @@
 
   private computeChangesUrl(name?: RepoName) {
     if (!name) return '';
-    return GerritNav.getUrlForProjectChanges(name as RepoName);
+    return GerritNav.getUrlForProjectChanges(name);
   }
 
   // private but used in test
diff --git a/polygerrit-ui/app/elements/admin/gr-repo/gr-repo_test.ts b/polygerrit-ui/app/elements/admin/gr-repo/gr-repo_test.ts
index 82338d3..65eee70 100644
--- a/polygerrit-ui/app/elements/admin/gr-repo/gr-repo_test.ts
+++ b/polygerrit-ui/app/elements/admin/gr-repo/gr-repo_test.ts
@@ -214,7 +214,7 @@
     });
     await element.updateComplete;
 
-    assert.deepEqual(element.repoConfig!.plugin_config!.test, {
+    assert.deepEqual(element.repoConfig.plugin_config!.test, {
       test: {display_name: 'test plugin', type: 'STRING'},
     } as PluginParameterToConfigParameterInfoMap);
     assert.isTrue(requestUpdateStub.called);
diff --git a/polygerrit-ui/app/elements/admin/gr-rule-editor/gr-rule-editor_test.ts b/polygerrit-ui/app/elements/admin/gr-rule-editor/gr-rule-editor_test.ts
index b4b905b..9fe2999 100644
--- a/polygerrit-ui/app/elements/admin/gr-rule-editor/gr-rule-editor_test.ts
+++ b/polygerrit-ui/app/elements/admin/gr-rule-editor/gr-rule-editor_test.ts
@@ -220,7 +220,7 @@
         .returns(defaultValue);
       element.setDefaultRuleValues();
       assert.isTrue(getDefaultRuleValuesStub.called);
-      assert.equal(element.rule!.value, defaultValue);
+      assert.equal(element.rule.value, defaultValue);
     });
 
     test('computeOptions', () => {
@@ -243,10 +243,10 @@
       };
       element.addEventListener('access-modified', modifiedHandler);
       element.handleValueChange();
-      assert.isNotOk(element.rule!.value!.modified);
+      assert.isNotOk(element.rule.value!.modified);
       element.originalRuleValues = {action: PermissionAction.ALLOW};
       element.handleValueChange();
-      assert.isTrue(element.rule!.value!.modified);
+      assert.isTrue(element.rule.value!.modified);
       assert.isTrue(modifiedHandler.called);
     });
 
@@ -313,11 +313,11 @@
           .display,
         'none'
       );
-      assert.isNotOk(element.rule!.value!.modified);
+      assert.isNotOk(element.rule.value!.modified);
       const actionBindValue = queryAndAssert<GrSelect>(element, '#action');
       actionBindValue.bindValue = PermissionAction.DENY;
       await element.updateComplete;
-      assert.isTrue(element.rule!.value!.modified);
+      assert.isTrue(element.rule.value!.modified);
       element.editing = false;
       await element.updateComplete;
       assert.equal(
@@ -325,8 +325,8 @@
           .display,
         'none'
       );
-      assert.deepEqual(element.originalRuleValues, element.rule!.value);
-      assert.isNotOk(element.rule!.value!.modified);
+      assert.deepEqual(element.originalRuleValues, element.rule.value);
+      assert.isNotOk(element.rule.value!.modified);
       assert.equal(element.rule?.value?.action, PermissionAction.ALLOW);
       assert.equal(
         queryAndAssert<GrSelect>(element, '#action').bindValue,
@@ -376,12 +376,12 @@
         ).classList.contains('deleted')
       );
       assert.isTrue(element.deleted);
-      assert.isTrue(element.rule!.value!.deleted);
+      assert.isTrue(element.rule.value!.deleted);
 
       MockInteractions.tap(queryAndAssert<GrButton>(element, '#undoRemoveBtn'));
       await element.updateComplete;
       assert.isFalse(element.deleted);
-      assert.isNotOk(element.rule!.value!.deleted);
+      assert.isNotOk(element.rule.value!.deleted);
     });
 
     test('remove rule and cancel', async () => {
@@ -415,15 +415,15 @@
         'none'
       );
       assert.isTrue(element.deleted);
-      assert.isTrue(element.rule!.value!.deleted);
+      assert.isTrue(element.rule.value!.deleted);
 
       element.editing = false;
       await element.updateComplete;
       assert.isFalse(element.deleted);
-      assert.isNotOk(element.rule!.value!.deleted);
-      assert.isNotOk(element.rule!.value!.modified);
+      assert.isNotOk(element.rule.value!.deleted);
+      assert.isNotOk(element.rule.value!.modified);
 
-      assert.deepEqual(element.originalRuleValues, element.rule!.value);
+      assert.deepEqual(element.originalRuleValues, element.rule.value);
       assert.equal(
         getComputedStyle(queryAndAssert<GrButton>(element, '#removeBtn'))
           .display,
@@ -451,7 +451,7 @@
       element.section = 'refs/*';
       element.setupValues();
       await element.updateComplete;
-      element.rule!.value!.added = true;
+      element.rule.value!.added = true;
       await element.updateComplete;
       element.connectedCallback();
     });
@@ -583,7 +583,7 @@
       element.section = 'refs/*';
       element.setupValues();
       await element.updateComplete;
-      element.rule!.value!.added = true;
+      element.rule.value!.added = true;
       await element.updateComplete;
       element.connectedCallback();
     });
@@ -595,8 +595,8 @@
       assert.isTrue(setDefaultRuleValuesSpy.called);
 
       const expectedRuleValue = {
-        max: element.label!.values![element.label!.values.length - 1].value,
-        min: element.label!.values![0].value,
+        max: element.label!.values[element.label!.values.length - 1].value,
+        min: element.label!.values[0].value,
         action: PermissionAction.ALLOW,
         added: true,
       };
@@ -685,7 +685,7 @@
       element.section = 'refs/*';
       element.setupValues();
       await element.updateComplete;
-      element.rule!.value!.added = true;
+      element.rule.value!.added = true;
       await element.updateComplete;
       element.connectedCallback();
     });
diff --git a/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item.ts b/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item.ts
index 028c396..bfa8bd2 100644
--- a/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item.ts
+++ b/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item.ts
@@ -139,7 +139,7 @@
       this.getBulkActionsModel().selectedChangeNums$,
       selectedChangeNums => {
         if (!this.change) return;
-        this.checked = selectedChangeNums.includes(this.change!._number);
+        this.checked = selectedChangeNums.includes(this.change._number);
       }
     );
   }
@@ -614,9 +614,9 @@
     assertIsDefined(this.change, 'change');
     this.checked = !this.checked;
     if (this.checked)
-      this.getBulkActionsModel().addSelectedChangeNum(this.change!._number);
+      this.getBulkActionsModel().addSelectedChangeNum(this.change._number);
     else
-      this.getBulkActionsModel().removeSelectedChangeNum(this.change!._number);
+      this.getBulkActionsModel().removeSelectedChangeNum(this.change._number);
   }
 
   private changeStatuses() {
diff --git a/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item_test.ts b/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item_test.ts
index 68d52ca..3734f0a 100644
--- a/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item_test.ts
+++ b/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item_test.ts
@@ -430,7 +430,7 @@
       attention_set: {},
     };
     for (let i = 0; i < reviewerIds.length; i++) {
-      element.change!.reviewers.REVIEWER!.push({
+      element.change.reviewers.REVIEWER!.push({
         _account_id: reviewerIds[i] as AccountId,
         name: reviewerNames[i],
       });
diff --git a/polygerrit-ui/app/elements/change-list/gr-change-list-section/gr-change-list-section.ts b/polygerrit-ui/app/elements/change-list/gr-change-list-section/gr-change-list-section.ts
index ddc45fc..05d1282 100644
--- a/polygerrit-ui/app/elements/change-list/gr-change-list-section/gr-change-list-section.ts
+++ b/polygerrit-ui/app/elements/change-list/gr-change-list-section/gr-change-list-section.ts
@@ -151,9 +151,9 @@
           ?hidden=${!this.showStar}
         ></td>
         <td class="cell" colspan="${colSpan}">
-          ${this.changeSection!.emptyStateSlotName
+          ${this.changeSection.emptyStateSlotName
             ? html`<slot
-                name="${this.changeSection!.emptyStateSlotName}"
+                name="${this.changeSection.emptyStateSlotName}"
               ></slot>`
             : 'No changes'}
         </td>
@@ -178,10 +178,10 @@
           <td class="cell" colspan="${colSpan}">
             <h2 class="heading-3">
               <a
-                href="${this.sectionHref(this.changeSection!.query)}"
+                href="${this.sectionHref(this.changeSection.query)}"
                 class="section-title"
               >
-                <span class="section-name">${this.changeSection!.name}</span>
+                <span class="section-name">${this.changeSection.name}</span>
                 <span class="section-count-label"
                   >${this.changeSection.countLabel}</span
                 >
@@ -252,7 +252,7 @@
         ?selected=${selected}
         .change=${change}
         .config=${this.config}
-        .sectionName=${this.changeSection!.name}
+        .sectionName=${this.changeSection.name}
         .visibleChangeTableColumns=${columns}
         .showNumber=${this.showNumber}
         ?showStar=${this.showStar}
diff --git a/polygerrit-ui/app/elements/change-list/gr-change-list-view/gr-change-list-view_test.ts b/polygerrit-ui/app/elements/change-list/gr-change-list-view/gr-change-list-view_test.ts
index 0639620..d2bc40c 100644
--- a/polygerrit-ui/app/elements/change-list/gr-change-list-view/gr-change-list-view_test.ts
+++ b/polygerrit-ui/app/elements/change-list/gr-change-list-view/gr-change-list-view_test.ts
@@ -92,7 +92,7 @@
   });
 
   test('prevArrow', async () => {
-    element.changes = _.times(25, _.constant(createChange())) as ChangeInfo[];
+    element.changes = _.times(25, _.constant(createChange()));
     element.offset = 0;
     element.loading = false;
     await element.updateComplete;
@@ -112,14 +112,14 @@
     await element.updateComplete;
     assert.isOk(query(element, '#nextArrow'));
 
-    element.changes = _.times(25, _.constant(createChange())) as ChangeInfo[];
+    element.changes = _.times(25, _.constant(createChange()));
     await element.updateComplete;
     assert.isNotOk(query(element, '#nextArrow'));
   });
 
   test('handleNextPage', async () => {
     const showStub = sinon.stub(page, 'show');
-    element.changes = _.times(25, _.constant(createChange())) as ChangeInfo[];
+    element.changes = _.times(25, _.constant(createChange()));
     element.changesPerPage = 10;
     element.loading = false;
     await element.updateComplete;
@@ -139,7 +139,7 @@
   test('handlePreviousPage', async () => {
     const showStub = sinon.stub(page, 'show');
     element.offset = 0;
-    element.changes = _.times(25, _.constant(createChange())) as ChangeInfo[];
+    element.changes = _.times(25, _.constant(createChange()));
     element.changesPerPage = 10;
     element.loading = false;
     await element.updateComplete;
@@ -233,6 +233,7 @@
       const promise = mockPromise();
       sinon.stub(GerritNav, 'navigateToChange').callsFake((url, opt) => {
         assert.equal(url, change);
+        // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
         assert.isTrue(opt!.redirect);
         promise.resolve();
       });
@@ -251,6 +252,7 @@
       const promise = mockPromise();
       sinon.stub(GerritNav, 'navigateToChange').callsFake((url, opt) => {
         assert.equal(url, change);
+        // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
         assert.isTrue(opt!.redirect);
         promise.resolve();
       });
@@ -265,6 +267,7 @@
       const promise = mockPromise();
       sinon.stub(GerritNav, 'navigateToChange').callsFake((url, opt) => {
         assert.equal(url, change);
+        // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
         assert.isTrue(opt!.redirect);
         promise.resolve();
       });
diff --git a/polygerrit-ui/app/elements/change-list/gr-dashboard-view/gr-dashboard-view_test.ts b/polygerrit-ui/app/elements/change-list/gr-dashboard-view/gr-dashboard-view_test.ts
index 26f32e3..e588775 100644
--- a/polygerrit-ui/app/elements/change-list/gr-dashboard-view/gr-dashboard-view_test.ts
+++ b/polygerrit-ui/app/elements/change-list/gr-dashboard-view/gr-dashboard-view_test.ts
@@ -123,7 +123,7 @@
             results: [notOpenChange],
           },
         ];
-        assert.isFalse(changeIsOpen(element.results![0].results[0]));
+        assert.isFalse(changeIsOpen(element.results[0].results[0]));
         element.maybeShowDraftsBanner({
           view: GerritView.DASHBOARD,
           user: 'self',
diff --git a/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions_test.ts b/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions_test.ts
index 403d3fd..458d043 100644
--- a/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions_test.ts
+++ b/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions_test.ts
@@ -307,7 +307,7 @@
       // Total button number is one greater than the number of total actions
       // due to the existence of the overflow menu trigger.
       assert.equal(
-        buttonEls!.length + menuItems!.length,
+        buttonEls.length + menuItems!.length,
         element._allActionValues.length + 1
       );
       assert.isFalse(element.hidden);
@@ -871,10 +871,10 @@
 
         element._handleCherrypickConfirm();
 
-        const autogrowEl = queryAndAssert(
+        const autogrowEl = queryAndAssert<IronAutogrowTextareaElement>(
           element.$.confirmCherrypick,
           '#messageInput'
-        ) as IronAutogrowTextareaElement;
+        );
         assert.equal(autogrowEl.value, 'foo message');
 
         assert.deepEqual(fireActionStub.lastCall.args, [
@@ -1003,10 +1003,10 @@
 
         test('changes with duplicate project show an error', async () => {
           const dialog = element.$.confirmCherrypick;
-          const error = queryAndAssert(
+          const error = queryAndAssert<HTMLSpanElement>(
             dialog,
             '.error-message'
-          ) as HTMLSpanElement;
+          );
           assert.equal(error.innerText, '');
           dialog.updateChanges([
             {
@@ -1095,10 +1095,10 @@
       const cleanup = element._setLoadingOnButtonWithKey(type, key);
       assert.equal(element._actionLoadingMessage, 'Rebasing...');
 
-      const button = queryAndAssert(
+      const button = queryAndAssert<GrButton>(
         element,
         '[data-action-key="' + key + '"]'
-      ) as GrButton;
+      );
       assert.isTrue(button.hasAttribute('loading'));
       assert.isTrue(button.disabled);
 
@@ -1293,14 +1293,14 @@
           await flush();
           assert.equal(getChangesStub.args[0][1], 'submissionid: "199 0"');
           const confirmRevertDialog = element.$.confirmRevertDialog;
-          const revertSingleChangeLabel = queryAndAssert(
+          const revertSingleChangeLabel = queryAndAssert<HTMLLabelElement>(
             confirmRevertDialog,
             '.revertSingleChange'
-          ) as HTMLLabelElement;
-          const revertSubmissionLabel = queryAndAssert(
+          );
+          const revertSubmissionLabel = queryAndAssert<HTMLLabelElement>(
             confirmRevertDialog,
             '.revertSubmission'
-          ) as HTMLLabelElement;
+          );
           assert(
             revertSingleChangeLabel.innerText.trim() === 'Revert single change'
           );
@@ -1599,7 +1599,7 @@
       test('shows confirm dialog', async () => {
         element._handleDeleteTap();
         assert.isFalse(
-          (queryAndAssert(element, '#confirmDeleteDialog') as GrDialog).hidden
+          queryAndAssert<GrDialog>(element, '#confirmDeleteDialog').hidden
         );
         tap(
           queryAndAssert(
@@ -1621,7 +1621,7 @@
         );
         await flush();
         assert.isTrue(
-          (queryAndAssert(element, '#confirmDeleteDialog') as GrDialog).hidden
+          queryAndAssert<GrDialog>(element, '#confirmDeleteDialog').hidden
         );
         assert.isFalse(fireActionStub.called);
       });
@@ -2018,14 +2018,14 @@
       test('move action from overflow', async () => {
         assert.isNotOk(query(element, '[data-action-key="cherrypick"]'));
         assert.strictEqual(
-          element.$.moreActions!.items![0].id,
+          element.$.moreActions.items![0].id,
           'cherrypick-revision'
         );
         element.setActionOverflow(ActionType.REVISION, 'cherrypick', false);
         await flush();
         assert.isOk(query(element, '[data-action-key="cherrypick"]'));
         assert.notEqual(
-          element.$.moreActions!.items![0].id,
+          element.$.moreActions.items![0].id,
           'cherrypick-revision'
         );
       });
@@ -2104,7 +2104,7 @@
           revisions: createRevisions(element.latestPatchNum as number),
           messages: createChangeMessages(1),
         };
-        element.change!._number = 42 as NumericChangeId;
+        element.change._number = 42 as NumericChangeId;
 
         onShowError = sinon.stub();
         element.addEventListener('show-error', onShowError);
@@ -2308,6 +2308,7 @@
           );
           const sendStub = stubRestApi('executeChangeAction').callsFake(
             (_num, _method, _patchNum, _endpoint, _payload, onErr) => {
+              // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
               onErr!();
               return Promise.resolve(undefined);
             }
diff --git a/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata_test.ts b/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata_test.ts
index 04c886a..54c709a 100644
--- a/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata_test.ts
+++ b/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata_test.ts
@@ -522,7 +522,7 @@
     });
 
     test('Push Certificate Validation is missing test', () => {
-      change!.revisions.rev1! = createRevision(1);
+      change!.revisions.rev1 = createRevision(1);
       const result = element._computePushCertificateValidation(
         serverConfig,
         change
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.ts b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.ts
index 349fa5e..8389f2b 100644
--- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.ts
+++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.ts
@@ -1638,7 +1638,7 @@
     } else {
       const reason = getAddedByReason(this._account, this._serverConfig);
       fireAlert(this, 'Adding you to the attention set ...');
-      this._change.attention_set[this._account._account_id!] = {
+      this._change.attention_set[this._account._account_id] = {
         account: this._account,
         reason,
         reason_account: this._account,
@@ -2051,7 +2051,7 @@
     assertIsDefined(this._changeNum, '_changeNum');
     assertIsDefined(this._patchRange?.patchNum, '_patchRange.patchNum');
     return this.restApiService
-      .getChangeCommitInfo(this._changeNum, this._patchRange!.patchNum)
+      .getChangeCommitInfo(this._changeNum, this._patchRange.patchNum)
       .then(commitInfo => {
         this._commitInfo = commitInfo;
       });
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.ts b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.ts
index 170637a..b708020 100644
--- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.ts
+++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.ts
@@ -233,6 +233,7 @@
         {
           path: '/COMMIT_MSG',
           author: {
+            // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
             _account_id: 1000000 as AccountId,
             name: 'user',
             username: 'user',
@@ -2022,7 +2023,7 @@
   test('patch range changed', () => {
     element._patchRange = undefined;
     element._change = createChangeViewChange();
-    element._change!.revisions = createRevisions(4);
+    element._change.revisions = createRevisions(4);
     element._change.current_revision = '1' as CommitId;
     element._change = {...element._change};
 
diff --git a/polygerrit-ui/app/elements/change/gr-download-dialog/gr-download-dialog_test.ts b/polygerrit-ui/app/elements/change/gr-download-dialog/gr-download-dialog_test.ts
index 4c5a3ee..142b999 100644
--- a/polygerrit-ui/app/elements/change/gr-download-dialog/gr-download-dialog_test.ts
+++ b/polygerrit-ui/app/elements/change/gr-download-dialog/gr-download-dialog_test.ts
@@ -186,7 +186,7 @@
         element,
         '.closeButtonContainer gr-button'
       );
-      tap(closeButton!);
+      tap(closeButton);
       await closeCalled;
     });
   });
diff --git a/polygerrit-ui/app/elements/change/gr-label-scores/gr-label-scores.ts b/polygerrit-ui/app/elements/change/gr-label-scores/gr-label-scores.ts
index 35a2ba1..a369338 100644
--- a/polygerrit-ui/app/elements/change/gr-label-scores/gr-label-scores.ts
+++ b/polygerrit-ui/app/elements/change/gr-label-scores/gr-label-scores.ts
@@ -197,9 +197,9 @@
       return labels;
     }
     for (const label of Object.keys(this.permittedLabels ?? {})) {
-      const selectorEl = this.shadowRoot.querySelector(
+      const selectorEl = this.shadowRoot.querySelector<GrLabelScoreRow>(
         `gr-label-score-row[name="${label}"]`
-      ) as null | GrLabelScoreRow;
+      );
       if (!selectorEl?.selectedItem) continue;
 
       const selectedVal =
diff --git a/polygerrit-ui/app/elements/change/gr-message/gr-message_test.ts b/polygerrit-ui/app/elements/change/gr-message/gr-message_test.ts
index 2acc2a8..ffe59f0 100644
--- a/polygerrit-ui/app/elements/change/gr-message/gr-message_test.ts
+++ b/polygerrit-ui/app/elements/change/gr-message/gr-message_test.ts
@@ -133,16 +133,14 @@
         (e: CustomEvent<ChangeMessageDeletedEventDetail>) => {
           assert.deepEqual(e.detail.message, element.message);
           assert.isFalse(
-            (queryAndAssert(element, '.deleteBtn') as GrButton).disabled
+            queryAndAssert<GrButton>(element, '.deleteBtn').disabled
           );
           promise.resolve();
         }
       );
       await flush();
       tap(queryAndAssert(element, '.deleteBtn'));
-      assert.isTrue(
-        (queryAndAssert(element, '.deleteBtn') as GrButton).disabled
-      );
+      assert.isTrue(queryAndAssert<GrButton>(element, '.deleteBtn').disabled);
       await promise;
     });
 
diff --git a/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list_test.ts b/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list_test.ts
index 94b8668..f8c8317 100644
--- a/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list_test.ts
+++ b/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list_test.ts
@@ -214,7 +214,7 @@
         section,
         'gr-related-collapse'
       );
-      assert.isTrue(relatedChanges!.classList.contains('first'));
+      assert.isTrue(relatedChanges.classList.contains('first'));
     });
 
     test('first empty second non-empty', async () => {
@@ -231,7 +231,7 @@
         queryAndAssert<HTMLElement>(element, '#submittedTogether'),
         'gr-related-collapse'
       );
-      assert.isTrue(submittedTogetherSection!.classList.contains('first'));
+      assert.isTrue(submittedTogetherSection.classList.contains('first'));
     });
 
     test('first non-empty second empty third non-empty', async () => {
@@ -249,7 +249,7 @@
         queryAndAssert<HTMLElement>(element, '#relatedChanges'),
         'gr-related-collapse'
       );
-      assert.isTrue(relatedChanges!.classList.contains('first'));
+      assert.isTrue(relatedChanges.classList.contains('first'));
       const submittedTogetherSection = query<HTMLElement>(
         element,
         '#submittedTogether'
@@ -259,7 +259,7 @@
         queryAndAssert<HTMLElement>(element, '#cherryPicks'),
         'gr-related-collapse'
       );
-      assert.isFalse(cherryPicks!.classList.contains('first'));
+      assert.isFalse(cherryPicks.classList.contains('first'));
     });
   });
 
diff --git a/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog_test.ts b/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog_test.ts
index 14ad4ad..a8251aa 100644
--- a/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog_test.ts
+++ b/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog_test.ts
@@ -69,7 +69,6 @@
 import {GrLabelScoreRow} from '../gr-label-score-row/gr-label-score-row';
 import {GrLabelScores} from '../gr-label-scores/gr-label-scores';
 import {GrThreadList} from '../gr-thread-list/gr-thread-list';
-import {GrOverlay} from '../../shared/gr-overlay/gr-overlay';
 
 const basicFixture = fixtureFromElement('gr-reply-dialog');
 
@@ -128,7 +127,7 @@
       ...createChange(),
       _number: changeNum,
       owner: {
-        _account_id: 999 as AccountId as AccountId,
+        _account_id: 999 as AccountId,
         display_name: 'Kermit',
       },
       labels: {
@@ -237,7 +236,7 @@
       ignore_automatic_attention_set_rules: true,
     });
     assert.isFalse(
-      (queryAndAssert(element, '#commentList') as GrThreadList).hidden
+      queryAndAssert<GrThreadList>(element, '#commentList').hidden
     );
   });
 
@@ -354,7 +353,7 @@
     const hasDrafts = draftThreads.length > 0;
     element._computeNewAttention(
       user,
-      reviewers!,
+      reviewers,
       emptyAccountInfoInputChanges,
       change,
       draftThreads,
@@ -1037,20 +1036,20 @@
 
   test('getlabelValue returns value', async () => {
     await flush();
-    const el = queryAndAssert(
+    const el = queryAndAssert<GrLabelScoreRow>(
       queryAndAssert(element, 'gr-label-scores'),
       'gr-label-score-row[name="Verified"]'
-    ) as GrLabelScoreRow;
+    );
     el.setSelectedValue('-1');
     assert.equal('-1', element.getLabelValue('Verified'));
   });
 
   test('getlabelValue when no score is selected', async () => {
     await flush();
-    const el = queryAndAssert(
+    const el = queryAndAssert<GrLabelScoreRow>(
       queryAndAssert(element, 'gr-label-scores'),
       'gr-label-score-row[name="Code-Review"]'
-    ) as GrLabelScoreRow;
+    );
     el.setSelectedValue('-1');
     assert.strictEqual(element.getLabelValue('Verified'), ' 0');
   });
@@ -1063,8 +1062,9 @@
     element.setLabelValue(label, value);
     await flush();
 
-    const labels = (
-      queryAndAssert(element, '#labelScores') as GrLabelScores
+    const labels = queryAndAssert<GrLabelScores>(
+      element,
+      '#labelScores'
     ).getLabelValues();
     assert.deepEqual(labels, {
       'Code-Review': 0,
@@ -1166,8 +1166,9 @@
     observer = overlayObserver('closed');
     const expected = 'Group name has 10 members';
     assert.notEqual(
-      (
-        queryAndAssert(element, 'reviewerConfirmationOverlay') as GrOverlay
+      queryAndAssert<HTMLElement>(
+        element,
+        'reviewerConfirmationOverlay'
       ).innerText.indexOf(expected),
       -1
     );
@@ -1181,19 +1182,18 @@
     // We should be focused on account entry input.
     assert.isTrue(
       isFocusInsideElement(
-        (queryAndAssert(element, '#reviewers') as GrAccountList).$.entry.$.input
-          .$.input
+        queryAndAssert<GrAccountList>(element, '#reviewers').$.entry.$.input.$
+          .input
       )
     );
 
     // No reviewer/CC should have been added.
     assert.equal(
-      (queryAndAssert(element, '#ccs') as GrAccountList).additions().length,
+      queryAndAssert<GrAccountList>(element, '#ccs').additions().length,
       0
     );
     assert.equal(
-      (queryAndAssert(element, '#reviewers') as GrAccountList).additions()
-        .length,
+      queryAndAssert<GrAccountList>(element, '#reviewers').additions().length,
       0
     );
 
@@ -1223,8 +1223,8 @@
       isVisible(queryAndAssert(element, 'reviewerConfirmationOverlay'))
     );
     const additions = cc
-      ? (queryAndAssert(element, '#ccs') as GrAccountList).additions()
-      : (queryAndAssert(element, '#reviewers') as GrAccountList).additions();
+      ? queryAndAssert<GrAccountList>(element, '#ccs').additions()
+      : queryAndAssert<GrAccountList>(element, '#reviewers').additions();
     assert.deepEqual(additions, [
       {
         group: {
@@ -1241,15 +1241,14 @@
     if (cc) {
       assert.isTrue(
         isFocusInsideElement(
-          (queryAndAssert(element, '#ccs') as GrAccountList).$.entry.$.input.$
-            .input
+          queryAndAssert<GrAccountList>(element, '#ccs').$.entry.$.input.$.input
         )
       );
     } else {
       assert.isTrue(
         isFocusInsideElement(
-          (queryAndAssert(element, '#reviewers') as GrAccountList).$.entry.$
-            .input.$.input
+          queryAndAssert<GrAccountList>(element, '#reviewers').$.entry.$.input.$
+            .input
         )
       );
     }
@@ -1273,11 +1272,9 @@
   test('_reviewersMutated when account-text-change is fired from ccs', () => {
     flush();
     assert.isFalse(element._reviewersMutated);
-    assert.isTrue(
-      (queryAndAssert(element, '#ccs') as GrAccountList).allowAnyInput
-    );
+    assert.isTrue(queryAndAssert<GrAccountList>(element, '#ccs').allowAnyInput);
     assert.isFalse(
-      (queryAndAssert(element, '#reviewers') as GrAccountList).allowAnyInput
+      queryAndAssert<GrAccountList>(element, '#reviewers').allowAnyInput
     );
     queryAndAssert(element, '#ccs').dispatchEvent(
       new CustomEvent('account-text-changed', {bubbles: true, composed: true})
@@ -1341,6 +1338,7 @@
   test('400 converts to human-readable server-error', async () => {
     stubRestApi('saveChangeReview').callsFake(
       (_changeNum, _patchNum, _review, errFn) => {
+        // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
         errFn!(
           cloneableResponse(
             400,
@@ -1370,6 +1368,7 @@
   test('non-json 400 is treated as a normal server-error', async () => {
     stubRestApi('saveChangeReview').callsFake(
       (_changeNum, _patchNum, _review, errFn) => {
+        // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
         errFn!(cloneableResponse(400, 'Comment validation error!') as Response);
         return Promise.resolve(new Response());
       }
@@ -1503,10 +1502,10 @@
     // tap() cause a race in some situations in shadow DOM.
     // The send button can be tapped before the others, causing the test to
     // fail.
-    const el = queryAndAssert(
+    const el = queryAndAssert<GrLabelScoreRow>(
       queryAndAssert(element, 'gr-label-scores'),
       'gr-label-score-row[name="Verified"]'
-    ) as GrLabelScoreRow;
+    );
     el.setSelectedValue('-1');
     tap(queryAndAssert(element, '.send'));
     await promise;
@@ -1636,8 +1635,8 @@
 
   test('migrate reviewers between states', async () => {
     flush();
-    const reviewers = queryAndAssert(element, '#reviewers') as GrAccountList;
-    const ccs = queryAndAssert(element, '#ccs') as GrAccountList;
+    const reviewers = queryAndAssert<GrAccountList>(element, '#reviewers');
+    const ccs = queryAndAssert<GrAccountList>(element, '#ccs');
     const reviewer1 = makeAccount();
     const reviewer2 = makeAccount();
     const cc1 = makeAccount();
@@ -1654,7 +1653,7 @@
     const mutations: ReviewerInput[] = [];
 
     stubSaveReview((review: ReviewInput) => {
-      mutations.push(...review!.reviewers!);
+      mutations.push(...review.reviewers!);
     });
 
     // Remove and add to other field.
@@ -1749,8 +1748,8 @@
 
   test('Ignore removal requests if being added as reviewer/CC', async () => {
     flush();
-    const reviewers = queryAndAssert(element, '#reviewers') as GrAccountList;
-    const ccs = queryAndAssert(element, '#ccs') as GrAccountList;
+    const reviewers = queryAndAssert<GrAccountList>(element, '#reviewers');
+    const ccs = queryAndAssert<GrAccountList>(element, '#ccs');
     const reviewer1 = makeAccount();
     element._reviewers = [reviewer1];
     element._ccs = [];
@@ -1763,7 +1762,7 @@
     const mutations: ReviewerInput[] = [];
 
     stubSaveReview((review: ReviewInput) => {
-      mutations.push(...review!.reviewers!);
+      mutations.push(...review.reviewers!);
     });
 
     // Remove and add to other field.
diff --git a/polygerrit-ui/app/elements/change/gr-reviewer-list/gr-reviewer-list_test.ts b/polygerrit-ui/app/elements/change/gr-reviewer-list/gr-reviewer-list_test.ts
index a5bcc3a..f942443 100644
--- a/polygerrit-ui/app/elements/change/gr-reviewer-list/gr-reviewer-list_test.ts
+++ b/polygerrit-ui/app/elements/change/gr-reviewer-list/gr-reviewer-list_test.ts
@@ -323,9 +323,7 @@
     assert.equal(element._hiddenReviewerCount, 0);
     assert.equal(element._displayedReviewers.length, 4);
     assert.equal(element._reviewers.length, 4);
-    assert.isTrue(
-      (queryAndAssert(element, '.hiddenReviewers') as GrButton).hidden
-    );
+    assert.isTrue(queryAndAssert<GrButton>(element, '.hiddenReviewers').hidden);
   });
 
   test('account owner comes first in list of reviewers', () => {
@@ -378,7 +376,7 @@
     assert.equal(element._displayedReviewers.length, 6);
     assert.equal(element._reviewers.length, 9);
     assert.isFalse(
-      (queryAndAssert(element, '.hiddenReviewers') as GrButton).hidden
+      queryAndAssert<GrButton>(element, '.hiddenReviewers').hidden
     );
   });
 
@@ -406,7 +404,7 @@
     assert.equal(element._displayedReviewers.length, 6);
     assert.equal(element._reviewers.length, 100);
     assert.isFalse(
-      (queryAndAssert(element, '.hiddenReviewers') as GrButton).hidden
+      queryAndAssert<GrButton>(element, '.hiddenReviewers').hidden
     );
 
     tap(queryAndAssert(element, '.hiddenReviewers'));
@@ -414,9 +412,7 @@
     assert.equal(element._hiddenReviewerCount, 0);
     assert.equal(element._displayedReviewers.length, 100);
     assert.equal(element._reviewers.length, 100);
-    assert.isTrue(
-      (queryAndAssert(element, '.hiddenReviewers') as GrButton).hidden
-    );
+    assert.isTrue(queryAndAssert<GrButton>(element, '.hiddenReviewers').hidden);
   });
 
   test('votable labels', () => {
diff --git a/polygerrit-ui/app/elements/change/gr-submit-requirements/gr-submit-requirements_test.ts b/polygerrit-ui/app/elements/change/gr-submit-requirements/gr-submit-requirements_test.ts
index 0487316..9fffbda 100644
--- a/polygerrit-ui/app/elements/change/gr-submit-requirements/gr-submit-requirements_test.ts
+++ b/polygerrit-ui/app/elements/change/gr-submit-requirements/gr-submit-requirements_test.ts
@@ -147,7 +147,7 @@
 
     test('without label to vote on', async () => {
       const modifiedChange = {...change};
-      modifiedChange.submit_requirements![0]!.submittability_expression_result!.expression =
+      modifiedChange.submit_requirements![0]!.submittability_expression_result.expression =
         'hasfooter:"Release-Notes"';
       element.change = modifiedChange;
       await element.updateComplete;
diff --git a/polygerrit-ui/app/elements/core/gr-error-dialog/gr-error-dialog_test.ts b/polygerrit-ui/app/elements/core/gr-error-dialog/gr-error-dialog_test.ts
index 79e92b2..b42b20a 100644
--- a/polygerrit-ui/app/elements/core/gr-error-dialog/gr-error-dialog_test.ts
+++ b/polygerrit-ui/app/elements/core/gr-error-dialog/gr-error-dialog_test.ts
@@ -14,7 +14,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 import * as MockInteractions from '@polymer/iron-test-helpers/mock-interactions';
 import '../../../test/common-test-setup-karma';
 import {mockPromise, queryAndAssert} from '../../../test/test-utils';
@@ -35,7 +34,7 @@
     const dismissCalled = mockPromise();
     element.addEventListener('dismiss', () => dismissCalled.resolve());
     MockInteractions.tap(
-      (queryAndAssert(element, '#dialog') as GrDialog).confirmButton!
+      queryAndAssert<GrDialog>(element, '#dialog').confirmButton!
     );
     await dismissCalled;
   });
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host.ts b/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host.ts
index cb4d1e6..d9f6d7c 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host.ts
+++ b/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host.ts
@@ -433,7 +433,7 @@
       this.diff = diff;
       this.reporting.timeEnd(Timing.DIFF_LOAD, this.timingDetails());
       this.reporting.time(Timing.DIFF_CONTENT);
-      const event = (await waitForEventOnce(this, 'render')) as CustomEvent;
+      const event = await waitForEventOnce(this, 'render');
       this.reporting.timeEnd(Timing.DIFF_CONTENT, this.timingDetails());
       if (shouldReportMetric) {
         // We report diffViewContentDisplayed only on reload caused
diff --git a/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select_test.ts b/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select_test.ts
index 342fe3a..dc501c8 100644
--- a/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select_test.ts
+++ b/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select_test.ts
@@ -80,10 +80,10 @@
 
   test('enabled/disabled options', async () => {
     element.revisions = [
-      createRevision(3) as RevisionInfo,
-      createEditRevision(2) as EditRevisionInfo,
-      createRevision(2) as RevisionInfo,
-      createRevision(1) as RevisionInfo,
+      createRevision(3),
+      createEditRevision(2),
+      createRevision(2),
+      createRevision(1),
     ];
     await element.updateComplete;
 
@@ -259,10 +259,10 @@
     ];
     element.basePatchNum = 1 as BasePatchSetNum;
     element.revisions = [
-      createRevision(3) as RevisionInfo,
-      createEditRevision(2) as EditRevisionInfo,
-      createRevision(2, 'description') as RevisionInfo,
-      createRevision(1) as RevisionInfo,
+      createRevision(3),
+      createEditRevision(2),
+      createRevision(2, 'description'),
+      createRevision(1),
     ];
     await element.updateComplete;
 
diff --git a/polygerrit-ui/app/elements/edit/gr-edit-controls/gr-edit-controls.ts b/polygerrit-ui/app/elements/edit/gr-edit-controls/gr-edit-controls.ts
index 7229b6d..9c53787 100644
--- a/polygerrit-ui/app/elements/edit/gr-edit-controls/gr-edit-controls.ts
+++ b/polygerrit-ui/app/elements/edit/gr-edit-controls/gr-edit-controls.ts
@@ -174,9 +174,7 @@
   }
 
   _hideAllDialogs() {
-    const dialogs = this.root!.querySelectorAll(
-      '.dialog'
-    ) as NodeListOf<GrDialog>;
+    const dialogs = this.root!.querySelectorAll<GrDialog>('.dialog');
     for (const dialog of dialogs) {
       // We set the second param to false, because this function
       // is called by _showDialog which when you open either restore,
@@ -327,7 +325,7 @@
   _handleFileUploadChanged(event: InputEvent) {
     if (!event.target) return;
     if (!(event.target instanceof HTMLInputElement)) return;
-    const input = event.target as HTMLInputElement;
+    const input = event.target;
     if (!input.files) return;
     this._fileUpload(input.files);
   }
diff --git a/polygerrit-ui/app/elements/edit/gr-edit-controls/gr-edit-controls_test.ts b/polygerrit-ui/app/elements/edit/gr-edit-controls/gr-edit-controls_test.ts
index 58fa85e..4dd3838 100644
--- a/polygerrit-ui/app/elements/edit/gr-edit-controls/gr-edit-controls_test.ts
+++ b/polygerrit-ui/app/elements/edit/gr-edit-controls/gr-edit-controls_test.ts
@@ -65,8 +65,7 @@
     setup(() => {
       editDiffStub = sinon.stub(GerritNav, 'getEditUrlForDiff');
       navStub = sinon.stub(GerritNav, 'navigateToRelativeUrl');
-      openAutoComplete =
-        element.$.openDialog!.querySelector('gr-autocomplete')!;
+      openAutoComplete = element.$.openDialog.querySelector('gr-autocomplete')!;
     });
 
     test('_isValidPath', () => {
@@ -131,7 +130,7 @@
       eventStub = sinon.stub(element, 'dispatchEvent');
       deleteStub = stubRestApi('deleteFileInChangeEdit');
       deleteAutocomplete =
-        element.$.deleteDialog!.querySelector('gr-autocomplete')!;
+        element.$.deleteDialog.querySelector('gr-autocomplete')!;
     });
 
     test('delete', async () => {
@@ -190,7 +189,7 @@
       MockInteractions.tap(queryAndAssert(element, '#delete'));
       return showDialogSpy.lastCall.returnValue.then(() => {
         assert.isTrue(element.$.deleteDialog.disabled);
-        element.$.deleteDialog!.querySelector('gr-autocomplete')!.text =
+        element.$.deleteDialog.querySelector('gr-autocomplete')!.text =
           'src/test.cpp';
         assert.isFalse(element.$.deleteDialog.disabled);
         MockInteractions.tap(
@@ -212,7 +211,7 @@
       eventStub = sinon.stub(element, 'dispatchEvent');
       renameStub = stubRestApi('renameFileInChangeEdit');
       renameAutocomplete =
-        element.$.renameDialog!.querySelector('gr-autocomplete')!;
+        element.$.renameDialog.querySelector('gr-autocomplete')!;
     });
 
     test('rename', async () => {
@@ -281,7 +280,7 @@
       MockInteractions.tap(queryAndAssert(element, '#rename'));
       return showDialogSpy.lastCall.returnValue.then(() => {
         assert.isTrue(element.$.renameDialog.disabled);
-        element.$.renameDialog!.querySelector('gr-autocomplete')!.text =
+        element.$.renameDialog.querySelector('gr-autocomplete')!.text =
           'src/test.cpp';
         element.$.newPathIronInput.bindValue = 'src/test.newPath';
         assert.isFalse(element.$.renameDialog.disabled);
@@ -307,7 +306,7 @@
 
     test('restore hidden by default', () => {
       assert.isTrue(
-        queryAndAssert(element, '#restore').classList!.contains('invisible')!
+        queryAndAssert(element, '#restore').classList.contains('invisible')!
       );
     });
 
@@ -403,7 +402,7 @@
     await element.openOpenDialog('test/path.cpp');
     assert.isFalse(element.$.openDialog.hasAttribute('hidden'));
     assert.equal(
-      element.$.openDialog!.querySelector('gr-autocomplete')!.text,
+      element.$.openDialog.querySelector('gr-autocomplete')!.text,
       'test/path.cpp'
     );
   });
@@ -414,20 +413,20 @@
 
     MockInteractions.tap(element.$.openDialog);
     flush();
-    assert.equal(spy!.lastCall!.returnValue!.id, 'openDialog');
+    assert.equal(spy.lastCall.returnValue!.id, 'openDialog');
 
     MockInteractions.tap(element.$.deleteDialog);
     flush();
-    assert.equal(spy!.lastCall!.returnValue!.id, 'deleteDialog');
+    assert.equal(spy.lastCall.returnValue!.id, 'deleteDialog');
 
     MockInteractions.tap(
-      element.$.deleteDialog!.querySelector('gr-autocomplete')!
+      element.$.deleteDialog.querySelector('gr-autocomplete')!
     );
     flush();
-    assert.equal(spy!.lastCall!.returnValue!.id, 'deleteDialog');
+    assert.equal(spy.lastCall.returnValue!.id, 'deleteDialog');
 
     MockInteractions.tap(element);
     flush();
-    assert.notOk(spy!.lastCall!.returnValue);
+    assert.notOk(spy.lastCall.returnValue);
   });
 });
diff --git a/polygerrit-ui/app/elements/plugins/gr-endpoint-decorator/gr-endpoint-decorator.ts b/polygerrit-ui/app/elements/plugins/gr-endpoint-decorator/gr-endpoint-decorator.ts
index cb8bffb..8a01ef7 100644
--- a/polygerrit-ui/app/elements/plugins/gr-endpoint-decorator/gr-endpoint-decorator.ts
+++ b/polygerrit-ui/app/elements/plugins/gr-endpoint-decorator/gr-endpoint-decorator.ts
@@ -102,7 +102,7 @@
     [...directChildren, ...shadowChildren]
       .filter(node => node.nodeName !== 'GR-ENDPOINT-PARAM')
       .filter(node => node.nodeName !== 'SLOT')
-      .forEach(node => (node as ChildNode).remove());
+      .forEach(node => node.remove());
     const el = document.createElement(name);
     return this._initProperties(el, plugin).then((el: HTMLElement) =>
       this._appendChild(el)
diff --git a/polygerrit-ui/app/elements/settings/gr-change-table-editor/gr-change-table-editor.ts b/polygerrit-ui/app/elements/settings/gr-change-table-editor/gr-change-table-editor.ts
index bfe396c..eff22d1 100644
--- a/polygerrit-ui/app/elements/settings/gr-change-table-editor/gr-change-table-editor.ts
+++ b/polygerrit-ui/app/elements/settings/gr-change-table-editor/gr-change-table-editor.ts
@@ -81,12 +81,10 @@
    */
   _getDisplayedColumns() {
     if (this.root === null) return [];
-    return (
-      Array.from(
-        this.root.querySelectorAll(
-          '.checkboxContainer input:not([name=number])'
-        )
-      ) as HTMLInputElement[]
+    return Array.from(
+      this.root.querySelectorAll<HTMLInputElement>(
+        '.checkboxContainer input:not([name=number])'
+      )
     )
       .filter(checkbox => checkbox.checked)
       .map(checkbox => checkbox.name);
diff --git a/polygerrit-ui/app/elements/settings/gr-email-editor/gr-email-editor_test.ts b/polygerrit-ui/app/elements/settings/gr-email-editor/gr-email-editor_test.ts
index e4c1584..e478381 100644
--- a/polygerrit-ui/app/elements/settings/gr-email-editor/gr-email-editor_test.ts
+++ b/polygerrit-ui/app/elements/settings/gr-email-editor/gr-email-editor_test.ts
@@ -43,7 +43,7 @@
   test('renders', () => {
     const rows = element
       .shadowRoot!.querySelector('table')!
-      .querySelectorAll('tbody tr') as NodeListOf<HTMLTableRowElement>;
+      .querySelectorAll('tbody tr');
 
     assert.equal(rows.length, 3);
 
@@ -69,7 +69,7 @@
     const preferredChangedSpy = sinon.spy(element, '_handlePreferredChange');
     const radios = element
       .shadowRoot!.querySelector('table')!
-      .querySelectorAll('input[type=radio]') as NodeListOf<HTMLInputElement>;
+      .querySelectorAll<HTMLInputElement>('input[type=radio]');
 
     assert.isFalse(element.hasUnsavedChanges);
     assert.isNotOk(element._newPreferred);
@@ -125,7 +125,7 @@
 
     // Delete the first email and set the last as preferred.
     rows[0].querySelector('gr-button')!.click();
-    (rows[2].querySelector('input[type=radio]')! as HTMLInputElement).click();
+    rows[2].querySelector<HTMLInputElement>('input[type=radio]')!.click();
 
     assert.isTrue(element.hasUnsavedChanges);
     assert.equal(element._newPreferred, 'email@three.com');
diff --git a/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread.ts b/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread.ts
index ecb5761..5b95846 100644
--- a/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread.ts
+++ b/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread.ts
@@ -735,11 +735,7 @@
     assertIsDefined(this.changeNum, 'changeNum');
     assertIsDefined(this.repoName, 'repoName');
     const url = generateAbsoluteUrl(
-      GerritNav.getUrlForCommentsTab(
-        this.changeNum!,
-        this.repoName!,
-        comment.id
-      )
+      GerritNav.getUrlForCommentsTab(this.changeNum, this.repoName, comment.id)
     );
     assertIsDefined(url, 'url for comment');
     navigator.clipboard.writeText(generateAbsoluteUrl(url)).then(() => {
diff --git a/polygerrit-ui/app/elements/shared/gr-comment/gr-comment.ts b/polygerrit-ui/app/elements/shared/gr-comment/gr-comment.ts
index a0fcc42..2af218d 100644
--- a/polygerrit-ui/app/elements/shared/gr-comment/gr-comment.ts
+++ b/polygerrit-ui/app/elements/shared/gr-comment/gr-comment.ts
@@ -819,7 +819,7 @@
     if (!comment || !this.changeNum || !this.repoName) return '';
     if (!comment.id) throw new Error('comment must have an id');
     return GerritNav.getUrlForComment(
-      this.changeNum as NumericChangeId,
+      this.changeNum,
       this.repoName,
       comment.id
     );
diff --git a/polygerrit-ui/app/elements/shared/gr-comment/gr-comment_test.ts b/polygerrit-ui/app/elements/shared/gr-comment/gr-comment_test.ts
index 16ab2a2..62dcd69 100644
--- a/polygerrit-ui/app/elements/shared/gr-comment/gr-comment_test.ts
+++ b/polygerrit-ui/app/elements/shared/gr-comment/gr-comment_test.ts
@@ -405,7 +405,7 @@
     // messageText was empty so overwrite the message now
     assert.equal(element.messageText, 'hello world');
 
-    element.comment!.message = 'new message';
+    element.comment.message = 'new message';
     await element.updateComplete;
     // messageText was already set so do not overwrite it
     assert.equal(element.messageText, 'hello world');
@@ -430,7 +430,7 @@
     // messageText was empty so overwrite the message now
     assert.equal(element.messageText, 'hello world');
 
-    element.comment!.message = 'new message';
+    element.comment.message = 'new message';
     await element.updateComplete;
     // messageText was already set so do not overwrite it
     assert.equal(element.messageText, 'hello world');
@@ -630,7 +630,7 @@
         'create-fix-comment'
       );
       element.comment = createRobotComment();
-      element.comments = [element.comment!];
+      element.comments = [element.comment];
       await element.updateComplete;
 
       tap(queryAndAssert(element, '.fix'));
diff --git a/polygerrit-ui/app/elements/shared/gr-copy-clipboard/gr-copy-clipboard_test.ts b/polygerrit-ui/app/elements/shared/gr-copy-clipboard/gr-copy-clipboard_test.ts
index ef62fe9..6c43c43 100644
--- a/polygerrit-ui/app/elements/shared/gr-copy-clipboard/gr-copy-clipboard_test.ts
+++ b/polygerrit-ui/app/elements/shared/gr-copy-clipboard/gr-copy-clipboard_test.ts
@@ -14,7 +14,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 import '../../../test/common-test-setup-karma';
 import './gr-copy-clipboard';
 import {GrCopyClipboard} from './gr-copy-clipboard';
@@ -53,10 +52,10 @@
     const ironInputElement = queryAndAssert(element, 'iron-input');
     assert.notEqual(getComputedStyle(ironInputElement).display, 'none');
 
-    const inputElement = queryAndAssert(element, 'input') as HTMLInputElement;
+    const inputElement = queryAndAssert<HTMLInputElement>(element, 'input');
     MockInteractions.tap(inputElement);
     assert.equal(inputElement.selectionStart, 0);
-    assert.equal(inputElement.selectionEnd, element.text!.length! - 1);
+    assert.equal(inputElement.selectionEnd, element.text!.length - 1);
   });
 
   test('hideInput', async () => {
diff --git a/polygerrit-ui/app/elements/shared/gr-dropdown-list/gr-dropdown-list_test.ts b/polygerrit-ui/app/elements/shared/gr-dropdown-list/gr-dropdown-list_test.ts
index a1c2b0f..0416bf7 100644
--- a/polygerrit-ui/app/elements/shared/gr-dropdown-list/gr-dropdown-list_test.ts
+++ b/polygerrit-ui/app/elements/shared/gr-dropdown-list/gr-dropdown-list_test.ts
@@ -116,15 +116,15 @@
 
     assert.isNotOk(items[0].querySelector('gr-date-formatter'));
     assert.isNotOk(items[0].querySelector('.bottomContent'));
-    assert.equal(items[0].dataset.value, element.items![0].value as any);
-    assert.equal(mobileItems[0].value, element.items![0].value);
+    assert.equal(items[0].dataset.value, element.items[0].value as any);
+    assert.equal(mobileItems[0].value, element.items[0].value);
     assert.equal(
       queryAndAssert<HTMLDivElement>(items[0], '.topContent div').innerText,
-      element.items![0].text
+      element.items[0].text
     );
 
     // Since no mobile specific text, it should fall back to text.
-    assert.equal(mobileItems[0].text, element.items![0].text);
+    assert.equal(mobileItems[0].text, element.items[0].text);
 
     // Second Item
     // The second item should have top text, bottom text, and no date.
@@ -135,19 +135,19 @@
 
     assert.isNotOk(items[1].querySelector('gr-date-formatter'));
     assert.isOk(items[1].querySelector('.bottomContent'));
-    assert.equal(items[1].dataset.value, element.items![1].value as any);
-    assert.equal(mobileItems[1].value, element.items![1].value);
+    assert.equal(items[1].dataset.value, element.items[1].value as any);
+    assert.equal(mobileItems[1].value, element.items[1].value);
     assert.equal(
       queryAndAssert<HTMLDivElement>(items[1], '.topContent div').innerText,
-      element.items![1].text
+      element.items[1].text
     );
 
     // Since there is mobile specific text, it should that.
-    assert.equal(mobileItems[1].text, element.items![1].mobileText);
+    assert.equal(mobileItems[1].text, element.items[1].mobileText);
 
     // Since this item is selected, and it has triggerText defined, that
     // should be used.
-    assert.equal(element.text, element.items![1].triggerText);
+    assert.equal(element.text, element.items[1].triggerText);
 
     // Third item
     // The third item should be disabled, and have a date, and bottom content.
@@ -158,15 +158,15 @@
 
     assert.isOk(items[2].querySelector('gr-date-formatter'));
     assert.isOk(items[2].querySelector('.bottomContent'));
-    assert.equal(items[2].dataset.value, element.items![2].value as any);
-    assert.equal(mobileItems[2].value, element.items![2].value);
+    assert.equal(items[2].dataset.value, element.items[2].value as any);
+    assert.equal(mobileItems[2].value, element.items[2].value);
     assert.equal(
       queryAndAssert<HTMLDivElement>(items[2], '.topContent div').innerText,
-      element.items![2].text
+      element.items[2].text
     );
 
     // Since there is mobile specific text, it should that.
-    assert.equal(mobileItems[2].text, element.items![2].mobileText);
+    assert.equal(mobileItems[2].text, element.items[2].mobileText);
 
     // Select a new item.
     MockInteractions.tap(items[0]);
@@ -176,6 +176,6 @@
     assert.isTrue(mobileItems[0].selected);
 
     // Since no triggerText, the fallback is used.
-    assert.equal(element.text, element.items![0].text);
+    assert.equal(element.text, element.items[0].text);
   });
 });
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-endpoints.ts b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-endpoints.ts
index 38b4aee..bb0287a 100644
--- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-endpoints.ts
+++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-endpoints.ts
@@ -72,7 +72,7 @@
   _getOrCreateModuleInfo(plugin: PluginApi, opts: Options): ModuleInfo {
     const {endpoint, slot, type, moduleName, domHook} = opts;
     const existingModule = this._endpoints
-      .get(endpoint!)!
+      .get(endpoint)!
       .find(
         (info: ModuleInfo) =>
           info.plugin === plugin &&
@@ -91,7 +91,7 @@
         domHook,
         slot,
       };
-      this._endpoints.get(endpoint!)!.push(newModule);
+      this._endpoints.get(endpoint)!.push(newModule);
       return newModule;
     }
   }
diff --git a/polygerrit-ui/app/elements/shared/gr-lib-loader/resemblejs_config.ts b/polygerrit-ui/app/elements/shared/gr-lib-loader/resemblejs_config.ts
index 872d01c..5fd75da 100644
--- a/polygerrit-ui/app/elements/shared/gr-lib-loader/resemblejs_config.ts
+++ b/polygerrit-ui/app/elements/shared/gr-lib-loader/resemblejs_config.ts
@@ -20,7 +20,7 @@
   src: 'bower_components/resemblejs/resemble.js',
   checkPresent: () => window.resemble !== undefined,
   configureCallback: () => {
-    window.resemble!.outputSettings({
+    window.resemble.outputSettings({
       errorColor: {red: 255, green: 0, blue: 255},
       errorType: 'flat',
       transparency: 0,
diff --git a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-apis/gr-rest-api-helper_test.ts b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-apis/gr-rest-api-helper_test.ts
index 209cb5c..ef90764 100644
--- a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-apis/gr-rest-api-helper_test.ts
+++ b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-apis/gr-rest-api-helper_test.ts
@@ -112,7 +112,7 @@
       });
       assert.equal(writeScheduler.scheduled.length, 0);
       await assertReadRequest();
-      const res: Response = (await promise) as Response;
+      const res: Response = await promise;
       assert.equal(await res.text(), 'Yay');
     });
 
@@ -124,7 +124,7 @@
       });
       assert.equal(readScheduler.scheduled.length, 0);
       await assertWriteRequest();
-      const res: Response = (await promise) as Response;
+      const res: Response = await promise;
       assert.equal(await res.text(), 'Yay');
     });
   });
@@ -274,7 +274,7 @@
 
       // But we expect the result from the network to return a 429 error when
       // it's no longer being retried.
-      const res: Response = (await promise) as Response;
+      const res: Response = await promise;
       assert.equal(res.status, 429);
     });
 
@@ -306,7 +306,7 @@
       await flush();
       // We expect a retry.
       await assertReadRequest();
-      const res: Response = (await promise) as Response;
+      const res: Response = await promise;
       assert.equal(await res.text(), 'Yay');
     });
   });
diff --git a/polygerrit-ui/app/elements/shared/gr-tooltip/gr-tooltip_test.ts b/polygerrit-ui/app/elements/shared/gr-tooltip/gr-tooltip_test.ts
index b693a9e..db25c52 100644
--- a/polygerrit-ui/app/elements/shared/gr-tooltip/gr-tooltip_test.ts
+++ b/polygerrit-ui/app/elements/shared/gr-tooltip/gr-tooltip_test.ts
@@ -26,7 +26,7 @@
   let element: GrTooltip;
 
   setup(async () => {
-    element = basicFixture.instantiate() as GrTooltip;
+    element = basicFixture.instantiate();
     await element.updateComplete;
   });
 
diff --git a/polygerrit-ui/app/embed/diff/gr-context-controls/gr-context-controls.ts b/polygerrit-ui/app/embed/diff/gr-context-controls/gr-context-controls.ts
index 92cf968..0231967 100644
--- a/polygerrit-ui/app/embed/diff/gr-context-controls/gr-context-controls.ts
+++ b/polygerrit-ui/app/embed/diff/gr-context-controls/gr-context-controls.ts
@@ -462,7 +462,7 @@
     referenceLine: number
   ) {
     assertIsDefined(this.diff, 'diff');
-    const syntaxTree = this.diff!.meta_b.syntax_tree;
+    const syntaxTree = this.diff.meta_b.syntax_tree;
     const outlineSyntaxPath = findBlockTreePathForLine(
       referenceLine,
       syntaxTree
diff --git a/polygerrit-ui/app/embed/diff/gr-context-controls/gr-context-controls_test.ts b/polygerrit-ui/app/embed/diff/gr-context-controls/gr-context-controls_test.ts
index 7af40ed..0755dd0 100644
--- a/polygerrit-ui/app/embed/diff/gr-context-controls/gr-context-controls_test.ts
+++ b/polygerrit-ui/app/embed/diff/gr-context-controls/gr-context-controls_test.ts
@@ -373,7 +373,7 @@
       tooltipBelow.querySelector('.breadcrumbTooltip')!.textContent?.trim(),
       '20 common lines'
     );
-    assert.equal(tooltipAbove!.getAttribute('position'), 'top');
-    assert.equal(tooltipBelow!.getAttribute('position'), 'bottom');
+    assert.equal(tooltipAbove.getAttribute('position'), 'top');
+    assert.equal(tooltipBelow.getAttribute('position'), 'bottom');
   });
 });
diff --git a/polygerrit-ui/app/embed/diff/gr-diff-highlight/gr-diff-highlight.ts b/polygerrit-ui/app/embed/diff/gr-diff-highlight/gr-diff-highlight.ts
index 4c51201..2ee6c9f 100644
--- a/polygerrit-ui/app/embed/diff/gr-diff-highlight/gr-diff-highlight.ts
+++ b/polygerrit-ui/app/embed/diff/gr-diff-highlight/gr-diff-highlight.ts
@@ -474,9 +474,7 @@
       return;
     }
 
-    let actionBox = this.shadowRoot!.querySelector(
-      'gr-selection-action-box'
-    ) as GrSelectionActionBox | null;
+    let actionBox = this.shadowRoot!.querySelector('gr-selection-action-box');
     if (!actionBox) {
       actionBox = document.createElement('gr-selection-action-box');
       this.root!.insertBefore(actionBox, this.root!.firstElementChild);
diff --git a/polygerrit-ui/app/embed/diff/gr-diff-image-viewer/gr-image-viewer.ts b/polygerrit-ui/app/embed/diff/gr-diff-image-viewer/gr-image-viewer.ts
index 32a3282..c25b284 100644
--- a/polygerrit-ui/app/embed/diff/gr-diff-image-viewer/gr-image-viewer.ts
+++ b/polygerrit-ui/app/embed/diff/gr-diff-image-viewer/gr-image-viewer.ts
@@ -889,7 +889,7 @@
   }
 
   private handleFollowMouse(event: MouseEvent) {
-    const rect = this.imageArea!.getBoundingClientRect();
+    const rect = this.imageArea.getBoundingClientRect();
     const offsetX = event.clientX - rect.left;
     const offsetY = event.clientY - rect.top;
     const fractionX = offsetX / rect.width;
diff --git a/polygerrit-ui/app/embed/diff/gr-diff/gr-diff.ts b/polygerrit-ui/app/embed/diff/gr-diff/gr-diff.ts
index e35eff5..2aa220d 100644
--- a/polygerrit-ui/app/embed/diff/gr-diff/gr-diff.ts
+++ b/polygerrit-ui/app/embed/diff/gr-diff/gr-diff.ts
@@ -922,7 +922,7 @@
         // The thread group may already have a slot with the right name, but
         // that is okay because the first matching slot is used and the rest
         // are ignored.
-        const slot = document.createElement('slot') as HTMLSlotElement;
+        const slot = document.createElement('slot');
         if (slotAtt) slot.name = slotAtt;
         threadGroupEl.appendChild(slot);
         lastEl = threadEl;
diff --git a/polygerrit-ui/app/embed/diff/gr-ranged-comment-layer/gr-ranged-comment-layer.ts b/polygerrit-ui/app/embed/diff/gr-ranged-comment-layer/gr-ranged-comment-layer.ts
index 11712dc..9cab977 100644
--- a/polygerrit-ui/app/embed/diff/gr-ranged-comment-layer/gr-ranged-comment-layer.ts
+++ b/polygerrit-ui/app/embed/diff/gr-ranged-comment-layer/gr-ranged-comment-layer.ts
@@ -285,7 +285,7 @@
           // Normalize invalid ranges where the start is after the end but the
           // start still makes sense. Set the end to the end of the line.
           // @see Issue 5744
-          if (range.start! >= range.end! && range.start! < line.text.length) {
+          if (range.start >= range.end && range.start < line.text.length) {
             range.end = line.text.length;
             this.dispatchEvent(
               new CustomEvent('normalize-range', {
diff --git a/polygerrit-ui/app/mixins/iron-fit-mixin/iron-fit-mixin.ts b/polygerrit-ui/app/mixins/iron-fit-mixin/iron-fit-mixin.ts
index 57e034f..0a4466a 100644
--- a/polygerrit-ui/app/mixins/iron-fit-mixin/iron-fit-mixin.ts
+++ b/polygerrit-ui/app/mixins/iron-fit-mixin/iron-fit-mixin.ts
@@ -39,4 +39,4 @@
   // TODO(TS): mixinBehaviors in some lib is returning: `new () => T` instead
   // which will fail the type check due to missing IronFitBehavior interface
   // eslint-disable-next-line @typescript-eslint/no-explicit-any
-  mixinBehaviors([IronFitBehavior], superClass) as any;
+  mixinBehaviors([IronFitBehavior], superClass);
diff --git a/polygerrit-ui/app/mixins/iron-overlay-mixin/iron-overlay-mixin.ts b/polygerrit-ui/app/mixins/iron-overlay-mixin/iron-overlay-mixin.ts
index 8429e38..2e7dbca 100644
--- a/polygerrit-ui/app/mixins/iron-overlay-mixin/iron-overlay-mixin.ts
+++ b/polygerrit-ui/app/mixins/iron-overlay-mixin/iron-overlay-mixin.ts
@@ -39,4 +39,4 @@
   // instead which will fail the type check due to missing
   // IronOverlayBehavior interface
   // eslint-disable-next-line @typescript-eslint/no-explicit-any
-  mixinBehaviors([IronOverlayBehavior], superClass) as any;
+  mixinBehaviors([IronOverlayBehavior], superClass);
diff --git a/polygerrit-ui/app/models/change/change-model.ts b/polygerrit-ui/app/models/change/change-model.ts
index 6a93f33..b9a768c 100644
--- a/polygerrit-ui/app/models/change/change-model.ts
+++ b/polygerrit-ui/app/models/change/change-model.ts
@@ -244,7 +244,7 @@
               this.updateStateReviewedFiles([]);
               return of(undefined);
             }
-            return from(this.fetchReviewedFiles(currentPatchNum!, changeNum!));
+            return from(this.fetchReviewedFiles(currentPatchNum, changeNum));
           })
         )
         .subscribe(),
diff --git a/polygerrit-ui/app/models/comments/comments-model.ts b/polygerrit-ui/app/models/comments/comments-model.ts
index 03b71a4..00f92b5 100644
--- a/polygerrit-ui/app/models/comments/comments-model.ts
+++ b/polygerrit-ui/app/models/comments/comments-model.ts
@@ -330,7 +330,7 @@
   }
 
   finalize() {
-    document.removeEventListener('reload', this.reloadListener!);
+    document.removeEventListener('reload', this.reloadListener);
     for (const s of this.subscriptions) {
       s.unsubscribe();
     }
diff --git a/polygerrit-ui/app/models/comments/comments-model_test.ts b/polygerrit-ui/app/models/comments/comments-model_test.ts
index 9674794..01e2f6b 100644
--- a/polygerrit-ui/app/models/comments/comments-model_test.ts
+++ b/polygerrit-ui/app/models/comments/comments-model_test.ts
@@ -17,7 +17,6 @@
 import '../../test/common-test-setup-karma';
 import {createDraft} from '../../test/test-data-generators';
 import {UrlEncodedCommentId} from '../../types/common';
-import {DraftInfo} from '../../utils/comment-util';
 import './comments-model';
 import {CommentsModel} from './comments-model';
 import {deleteDraft} from './comments-model';
@@ -42,7 +41,7 @@
       comments: {},
       robotComments: {},
       drafts: {
-        [draft.path!]: [draft as DraftInfo],
+        [draft.path!]: [draft],
       },
       portedComments: {},
       portedDrafts: {},
diff --git a/polygerrit-ui/app/services/app-context-init.ts b/polygerrit-ui/app/services/app-context-init.ts
index 10aa266..dfaa9c3 100644
--- a/polygerrit-ui/app/services/app-context-init.ts
+++ b/polygerrit-ui/app/services/app-context-init.ts
@@ -49,31 +49,31 @@
       new FlagsServiceImplementation(),
     reportingService: (ctx: Partial<AppContext>) => {
       assertIsDefined(ctx.flagsService, 'flagsService)');
-      return new GrReporting(ctx.flagsService!);
+      return new GrReporting(ctx.flagsService);
     },
     eventEmitter: (_ctx: Partial<AppContext>) => new EventEmitter(),
     authService: (ctx: Partial<AppContext>) => {
       assertIsDefined(ctx.eventEmitter, 'eventEmitter');
-      return new Auth(ctx.eventEmitter!);
+      return new Auth(ctx.eventEmitter);
     },
     restApiService: (ctx: Partial<AppContext>) => {
       assertIsDefined(ctx.authService, 'authService');
-      return new GrRestApiServiceImpl(ctx.authService!);
+      return new GrRestApiServiceImpl(ctx.authService);
     },
     jsApiService: (ctx: Partial<AppContext>) => {
       const reportingService = ctx.reportingService;
       assertIsDefined(reportingService, 'reportingService');
-      return new GrJsApiInterface(reportingService!);
+      return new GrJsApiInterface(reportingService);
     },
     storageService: (_ctx: Partial<AppContext>) => new GrStorageService(),
     userModel: (ctx: Partial<AppContext>) => {
       assertIsDefined(ctx.restApiService, 'restApiService');
-      return new UserModel(ctx.restApiService!);
+      return new UserModel(ctx.restApiService);
     },
     shortcutsService: (ctx: Partial<AppContext>) => {
       assertIsDefined(ctx.userModel, 'userModel');
       assertIsDefined(ctx.reportingService, 'reportingService');
-      return new ShortcutsService(ctx.userModel, ctx.reportingService!);
+      return new ShortcutsService(ctx.userModel, ctx.reportingService);
     },
     pluginsModel: (_ctx: Partial<AppContext>) => new PluginsModel(),
     highlightService: (_ctx: Partial<AppContext>) => new HighlightService(),
@@ -85,7 +85,7 @@
   appContext: AppContext
 ): Map<DependencyToken<unknown>, Finalizable> {
   const dependencies = new Map<DependencyToken<unknown>, Finalizable>();
-  const browserModel = new BrowserModel(appContext.userModel!);
+  const browserModel = new BrowserModel(appContext.userModel);
   dependencies.set(browserModelToken, browserModel);
 
   const changeModel = new ChangeModel(
diff --git a/polygerrit-ui/app/services/registry_test.ts b/polygerrit-ui/app/services/registry_test.ts
index d677be0..3bb584a 100644
--- a/polygerrit-ui/app/services/registry_test.ts
+++ b/polygerrit-ui/app/services/registry_test.ts
@@ -48,9 +48,8 @@
       foo: (_ctx: Partial<DemoContext>) => new Foo(final),
       bar: (ctx: Partial<DemoContext>) => new Bar(final, ctx.foo),
     };
-    const demoContext: DemoContext & Finalizable = create<DemoContext>(
-      demoRegistry
-    ) as DemoContext & Finalizable;
+    const demoContext: DemoContext & Finalizable =
+      create<DemoContext>(demoRegistry);
     demoContext.finalize();
     assert.deepEqual(final, ['Foo', 'Bar']);
   });
diff --git a/polygerrit-ui/app/test/test-app-context-init.ts b/polygerrit-ui/app/test/test-app-context-init.ts
index 7a9eee9..0d182d3 100644
--- a/polygerrit-ui/app/test/test-app-context-init.ts
+++ b/polygerrit-ui/app/test/test-app-context-init.ts
@@ -55,17 +55,17 @@
     restApiService: (_ctx: Partial<AppContext>) => grRestApiMock,
     jsApiService: (ctx: Partial<AppContext>) => {
       assertIsDefined(ctx.reportingService, 'reportingService');
-      return new GrJsApiInterface(ctx.reportingService!);
+      return new GrJsApiInterface(ctx.reportingService);
     },
     storageService: (_ctx: Partial<AppContext>) => grStorageMock,
     userModel: (ctx: Partial<AppContext>) => {
       assertIsDefined(ctx.restApiService, 'restApiService');
-      return new UserModel(ctx.restApiService!);
+      return new UserModel(ctx.restApiService);
     },
     shortcutsService: (ctx: Partial<AppContext>) => {
       assertIsDefined(ctx.userModel, 'userModel');
       assertIsDefined(ctx.reportingService, 'reportingService');
-      return new ShortcutsService(ctx.userModel!, ctx.reportingService!);
+      return new ShortcutsService(ctx.userModel, ctx.reportingService);
     },
     pluginsModel: (_ctx: Partial<AppContext>) => new PluginsModel(),
     highlightService: (_ctx: Partial<AppContext>) => new MockHighlightService(),
@@ -84,7 +84,7 @@
   resolver: <T>(token: DependencyToken<T>) => T
 ): Map<DependencyToken<unknown>, Creator<unknown>> {
   const dependencies = new Map();
-  const browserModel = () => new BrowserModel(appContext.userModel!);
+  const browserModel = () => new BrowserModel(appContext.userModel);
   dependencies.set(browserModelToken, browserModel);
 
   const changeModelCreator = () =>
diff --git a/polygerrit-ui/app/utils/attention-set-util.ts b/polygerrit-ui/app/utils/attention-set-util.ts
index b0b7ef8..0347581 100644
--- a/polygerrit-ui/app/utils/attention-set-util.ts
+++ b/polygerrit-ui/app/utils/attention-set-util.ts
@@ -49,7 +49,7 @@
   if (change?.attention_set === undefined) return '';
   if (account?._account_id === undefined) return '';
 
-  const attentionSetInfo = change.attention_set[account._account_id!];
+  const attentionSetInfo = change.attention_set[account._account_id];
 
   if (attentionSetInfo?.reason === undefined) return '';
 
diff --git a/polygerrit-ui/app/utils/comment-util.ts b/polygerrit-ui/app/utils/comment-util.ts
index 501da7d..2aefa99 100644
--- a/polygerrit-ui/app/utils/comment-util.ts
+++ b/polygerrit-ui/app/utils/comment-util.ts
@@ -111,7 +111,7 @@
 
     const date1 = parseDate(c1.updated);
     const date2 = parseDate(c2.updated);
-    const dateDiff = date1!.valueOf() - date2!.valueOf();
+    const dateDiff = date1.valueOf() - date2.valueOf();
     if (dateDiff !== 0) return dateDiff;
 
     const id1 = c1.id;
@@ -390,7 +390,7 @@
     };
   } else {
     return {
-      patchNum: latestPatchNum as RevisionPatchSetNum,
+      patchNum: latestPatchNum,
       basePatchNum: comment.patch_set as BasePatchSetNum,
     };
   }