diff --git a/lib/platform/azure/index.ts b/lib/platform/azure/index.ts
index 9b75df0ff01ff8422dd462159a03dd6448cc421e..ceb270426349876c24aaee7c47001480aa8a89a4 100644
--- a/lib/platform/azure/index.ts
+++ b/lib/platform/azure/index.ts
@@ -502,6 +502,7 @@ export /* istanbul ignore next */ function ensureIssue() {
   logger.warn(`ensureIssue() is not implemented`);
 }
 
+// eslint-disable-next-line @typescript-eslint/no-empty-function
 export /* istanbul ignore next */ function ensureIssueClosing() {}
 
 export /* istanbul ignore next */ function getIssueList() {
diff --git a/lib/platform/bitbucket/index.ts b/lib/platform/bitbucket/index.ts
index afb32278a9f700ca593aa532f28ca56efce66b0c..5daac06a82096a7c1bc2844a098eb8f3dff0b7d7 100644
--- a/lib/platform/bitbucket/index.ts
+++ b/lib/platform/bitbucket/index.ts
@@ -497,7 +497,7 @@ function matchesState(state: string, desiredState: string) {
 export async function findPr(
   branchName: string,
   prTitle?: string | null,
-  state: string = 'all'
+  state = 'all'
 ) {
   logger.debug(`findPr(${branchName}, ${prTitle}, ${state})`);
   const prList = await getPrList();
diff --git a/lib/platform/git/storage.ts b/lib/platform/git/storage.ts
index 3abd432ef896737e1b9badb29835f87e37dc606c..f4bfc524b292b2b16ec57a49c1d1fc006a565281 100644
--- a/lib/platform/git/storage.ts
+++ b/lib/platform/git/storage.ts
@@ -436,7 +436,7 @@ export class Storage {
     }
   }
 
-  // eslint-disable-next-line class-methods-use-this
+  // eslint-disable-next-line
   cleanRepo() {}
 
   static getUrl({
diff --git a/lib/workers/branch/get-updated.js b/lib/workers/branch/get-updated.js
index 7e0cc6240c46557823138d86c4ac6634fd5433ec..7bda9a23ee34edf0dafd28aa7f1251d4b94205d3 100644
--- a/lib/workers/branch/get-updated.js
+++ b/lib/workers/branch/get-updated.js
@@ -81,8 +81,7 @@ async function getUpdatedPackageFiles(config) {
         config
       );
       if (is.nonEmptyArray(results)) {
-        for (const res of results) {
-          // @ts-ignore
+        for (/** @type any */ const res of results) {
           const { file, artifactError } = res;
           if (file) {
             updatedArtifacts.push(file);
@@ -109,8 +108,7 @@ async function getUpdatedPackageFiles(config) {
           config
         );
         if (is.nonEmptyArray(results)) {
-          for (const res of results) {
-            // @ts-ignore
+          for (/** @type any */ const res of results) {
             const { file, artifactError } = res;
             if (file) {
               updatedArtifacts.push(file);
diff --git a/lib/workers/branch/schedule.js b/lib/workers/branch/schedule.js
index 4ce8a67136d20ea78520bc667f90fe1c23f6c5a2..2831dbe6547b5fee5330c54bbeaa28698776a138 100644
--- a/lib/workers/branch/schedule.js
+++ b/lib/workers/branch/schedule.js
@@ -15,6 +15,9 @@ function fixShortHours(input) {
   return input.replace(/( \d?\d)((a|p)m)/g, '$1:00$2');
 }
 
+/**
+ * @returns {[boolean] | [boolean, string]}
+ */
 function hasValidTimezone(timezone) {
   if (!moment.tz.zone(timezone)) {
     return [false, `Invalid timezone: ${timezone}`];
@@ -22,6 +25,9 @@ function hasValidTimezone(timezone) {
   return [true];
 }
 
+/**
+ * @returns {[boolean] | [boolean, string]}
+ */
 function hasValidSchedule(schedule) {
   let message;
   if (
@@ -85,7 +91,6 @@ function isScheduledNow(config) {
   }
   const [validSchedule, errorMessage] = hasValidSchedule(configSchedule);
   if (!validSchedule) {
-    // @ts-ignore
     logger.warn(errorMessage);
     return true;
   }
@@ -96,7 +101,6 @@ function isScheduledNow(config) {
     logger.debug({ timezone: config.timezone }, 'Found timezone');
     const [validTimezone, error] = hasValidTimezone(config.timezone);
     if (!validTimezone) {
-      // @ts-ignore
       logger.warn(error);
       return true;
     }
diff --git a/lib/workers/global/index.js b/lib/workers/global/index.js
index 281e0e94e73894fc34c74dacd33e5d3b6814948f..31bdba775b7bb47a4f29cbe1c99bae943cf2a434 100644
--- a/lib/workers/global/index.js
+++ b/lib/workers/global/index.js
@@ -73,7 +73,6 @@ async function start() {
 // istanbul ignore next
 function detectRenovateVersion() {
   try {
-    // @ts-ignore
     global.renovateVersion = require('../../../package.json').version; // eslint-disable-line global-require
   } catch (err) {
     logger.debug({ err }, 'Error getting renovate version');
diff --git a/lib/workers/pr/changelog/source-github.js b/lib/workers/pr/changelog/source-github.js
index 05106fb169295385993f190eb4d15e9cddb24103..e1b49523f1d0e8052b5056345921ae5bcf2b48c8 100644
--- a/lib/workers/pr/changelog/source-github.js
+++ b/lib/workers/pr/changelog/source-github.js
@@ -70,7 +70,6 @@ async function getChangeLogJSON({
   const githubApiBaseURL = sourceUrl.startsWith('https://github.com/')
     ? 'https://api.github.com/'
     : endpoint; // TODO FIX
-  // @ts-ignore
   const repository = pathname.slice(1).replace(/\/$/, '');
   if (repository.split('/').length !== 2) {
     logger.info({ sourceUrl }, 'Invalid github URL found');
diff --git a/lib/workers/repository/finalise/validate.js b/lib/workers/repository/finalise/validate.js
index ade9c898dadc1c9a0762161712fb47b3f690f3f8..dd26a2e31315e07faf9aa247d0fc3f80a2b79714 100644
--- a/lib/workers/repository/finalise/validate.js
+++ b/lib/workers/repository/finalise/validate.js
@@ -52,10 +52,7 @@ async function validatePrs(config) {
           if (file.endsWith('.json5')) {
             parsed = JSON5.parse(content);
           } else {
-            parsed = JSON.parse(
-              // @ts-ignore
-              content
-            );
+            parsed = JSON.parse(content);
           }
         } catch (err) {
           validations.push({
diff --git a/lib/workers/repository/init/config.js b/lib/workers/repository/init/config.js
index 6b8ad59b143a071783618922dfd8be391af73c0e..07ded19677e8dddf430308f74cba8c52af3a22ba 100644
--- a/lib/workers/repository/init/config.js
+++ b/lib/workers/repository/init/config.js
@@ -20,10 +20,7 @@ async function mergeRenovateConfig(config) {
     for (const fileName of configFileNames) {
       if (fileName === 'package.json') {
         try {
-          const pJson = JSON.parse(
-            // @ts-ignore
-            await platform.getFile('package.json')
-          );
+          const pJson = JSON.parse(await platform.getFile('package.json'));
           if (pJson.renovate) {
             logger.info('Using package.json for global renovate config');
             return 'package.json';
@@ -46,10 +43,7 @@ async function mergeRenovateConfig(config) {
   let renovateJson;
   if (configFile === 'package.json') {
     // We already know it parses
-    renovateJson = JSON.parse(
-      // @ts-ignore
-      await platform.getFile('package.json')
-    ).renovate;
+    renovateJson = JSON.parse(await platform.getFile('package.json')).renovate;
     logger.info({ config: renovateJson }, 'package.json>renovate config');
   } else {
     let renovateConfig = await platform.getFile(configFile);
diff --git a/lib/workers/repository/init/index.js b/lib/workers/repository/init/index.js
index 245bcfc9a1943f8239e9973629f9d5b5c0fd39d7..9870527218fd64736dfc8ce368f4a1ca87471e93 100644
--- a/lib/workers/repository/init/index.js
+++ b/lib/workers/repository/init/index.js
@@ -8,7 +8,6 @@ const { detectSemanticCommits } = require('./semantic');
 const { detectVulnerabilityAlerts } = require('./vulnerability');
 
 async function initRepo(input) {
-  // @ts-ignore
   global.repoCache = {};
   let config = {
     ...input,
diff --git a/lib/workers/repository/onboarding/branch/check.js b/lib/workers/repository/onboarding/branch/check.js
index 1b37cacc7c5f9ee5deea272a57e378e416862482..1c7c9e4f976811a9b9261c3dc12078a63abf5750 100644
--- a/lib/workers/repository/onboarding/branch/check.js
+++ b/lib/workers/repository/onboarding/branch/check.js
@@ -24,10 +24,7 @@ const configFileExists = async () => {
 
 const packageJsonConfigExists = async () => {
   try {
-    const pJson = JSON.parse(
-      // @ts-ignore
-      await platform.getFile('package.json')
-    );
+    const pJson = JSON.parse(await platform.getFile('package.json'));
     if (pJson[appSlug]) {
       return true;
     }
diff --git a/lib/workers/repository/onboarding/branch/config.js b/lib/workers/repository/onboarding/branch/config.js
index ffde5255ae8f321ebfb295ab622b5dd1306f74d2..de9d0f6ada0da869625d2311b13922dcaa3c82b7 100644
--- a/lib/workers/repository/onboarding/branch/config.js
+++ b/lib/workers/repository/onboarding/branch/config.js
@@ -13,10 +13,8 @@ async function getOnboardingConfig(config) {
   try {
     logger.debug('Checking for greenkeeper config');
 
-    const greenkeeperConfig = JSON.parse(
-      // @ts-ignore
-      await platform.getFile('package.json')
-    ).greenkeeper;
+    const greenkeeperConfig = JSON.parse(await platform.getFile('package.json'))
+      .greenkeeper;
     if (greenkeeperConfig) {
       onboardingConfig.statusCheckVerify = true;
     }
diff --git a/lib/workers/repository/process/lookup/filter.js b/lib/workers/repository/process/lookup/filter.js
index 20c671cebe3b1a50577605ed988b021ab3aa6e4f..6493acbef3b3f8e3ae3b711286494ffbea5ec6c9 100644
--- a/lib/workers/repository/process/lookup/filter.js
+++ b/lib/workers/repository/process/lookup/filter.js
@@ -56,11 +56,7 @@ function filterVersions(
         'Falling back to npm semver syntax for allowedVersions'
       );
       filteredVersions = filteredVersions.filter(v =>
-        semver.satisfies(
-          // @ts-ignore
-          semver.coerce(v),
-          allowedVersions
-        )
+        semver.satisfies(semver.coerce(v), allowedVersions)
       );
     } else {
       logger.warn(
diff --git a/lib/workers/repository/process/write.js b/lib/workers/repository/process/write.js
index 97ee733fd43feb2b6e125ef00d109a45c9463c46..4c0daa1aa66b12238c60c8267ea962add9f77229 100644
--- a/lib/workers/repository/process/write.js
+++ b/lib/workers/repository/process/write.js
@@ -31,7 +31,6 @@ async function writeUpdates(config, packageFiles, allBranches) {
       packageFiles
     );
     branch.res = res;
-    // @ts-ignore
     if (res === 'automerged' && config.automergeType !== 'pr-comment') {
       // Stop procesing other branches because base branch has been changed
       return res;
diff --git a/test/types/jest.d.ts b/test/types/jest.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ffc34fccce9380b7299be345a4ca625f5573ded5
--- /dev/null
+++ b/test/types/jest.d.ts
@@ -0,0 +1,9 @@
+declare namespace jest {
+  interface Matchers<R> {
+    /**
+     * only available in `test/website-docs.spec.js`
+     * @param arg
+     */
+    toContainOption(arg: R): void;
+  }
+}
diff --git a/test/website-docs.spec.js b/test/website-docs.spec.js
index 1c95febf0ea10049d97d0f1d3c09e7b15a7ae664..f484442d4f125a396e99b9c649749c887875f492 100644
--- a/test/website-docs.spec.js
+++ b/test/website-docs.spec.js
@@ -86,7 +86,6 @@ describe('docs', () => {
   // Lists through each option in the relatedOptions array to be able to locate the exact element which causes error, in case of one
   it('has valid relateOptions values', () => {
     relatedOptions.forEach(relOption => {
-      // @ts-ignore
       expect(allOptionNames).toContainOption(relOption);
     });
   });