Skip to content

Bug: @typescript-eslint/no-useless-constructor failed with Abstract Class + Inheritance #7996

@TechQuery

Description

@TechQuery

Before You File a Bug Report Please Confirm You Have Done The Following...

  • I have tried restarting my IDE and the issue persists.
  • I have updated to the latest version of the packages.
  • I have searched for related issues and found none that matched my issue.
  • I have read the FAQ and my problem is not listed.

Playground Link

https://typescript-eslint.io/play/#ts=5.3.2&fileType=.ts&code=JYWwDg9gTgLgBAbzgIQIYGcCmAaOAZYdGAYQAsBXAOwGs4BfOAMyghDgHIABYAE01RCoANkID0PVDFQBaLFABuwAMaZ2AbgCwAKFCRYifIRgBZCHyG4AcpgDuAEUmp6TFm3YgIAIwAe0qJiJGciF1bV1oeABHckwoAE8AZRgoYEoAcxdWDmjYuNlk1LTQrW1Mbz14VE8iKFQleCUhDHQ4ABUqoUxTcwAebTg4OzgymExKHha0LGx%2BuAAxYe9R8Zbre0ceuwA%2BOABeODWHKU2t7R2RsYnDIm7MIU3cOZ2EWYw4yiU4IQhUHgAFVBpTAACjAgMwAElxmUAFxwSjkECeWK4MFAhLAABemDhCKRKKYwCEoygcLmAEpELMBkoIJQiAZPGY4s59qgbKhgPAYKRCAA6RrAMYwPlAmA9AhEMhUagnLbA6kDOAAAwAJAgefzPBhMABVABKELoAH51Tl4kkUuk%2BTVCsBGHFgS8tErXXA%2BR7GESSTMXW6BmjIdDvL7-QHwRjsYqBnRyXRlYryZo-QN-DByFBKAZA0dUHCmTw4gBCPlCIy4GAQKRCYgQKgwfPMku0%2Bv0ZMx7R0bRAA&eslintrc=N4KABGBECmAeAu0B2ATAzpAXGA2uCU8AhgE4D2A9CdEQMbyT4C6ANPpAA4A2ArgOYBLJBmx4CUNAIC23aAFppHMiXhy0yhszYRIJHl2giwocZEUaKAMwEk0DbJDKXLkbQUiSZBhTI1qL5ipGMCTkJK74Op6yPkoq-ioUcHHwwdChyhGmAALwAJ4chrQkAhyqhlxC8BRIZHI8aNAGaGhytGTC8Hr0mQ5OLm46uQVFJWVyFVU1dWgAFkQoZADuWFD9We7UdNXq8e0yq47OGzpb9BQAVmiw9Y2tZ-Zrx4NQD1Q09ApIclc3aO2FQ7rfAAXxAIKAA&tsconfig=N4KABGBEDGD2C2AHAlgGwKYCcDyiAuysAdgM6QBcYoEEkeAhpgObp4VTokBMADAIwB2SABpwNSPFgATAK4Z2MBJKIArMqJpRM6SQDd0AYSXoieMpQBm9VCXQbxibbcz6jpPAFEiM%2BObB5MGTsxWklZDAAlTlhUGQJiBSJpdBEQjgAPRCxkeBMGVAARdDhMejxYTD8AoPtaJIBJJFRkaGQ8AEEiAE92KxtgzUhrVFgAdwBlLtMAC1YWoqs5PEbECrN2aoHxWDiC5EwFZoAjVMGkgFVvWykAGVhoayrArbrYS5lrgAVGely8LCeNTSkBIARaeAAcnJUAZZtAANaAl5QEg7TDQdAAWXoiA2z1qUCO9Fs50wqAUADpTuJMLBYHg9gdKJAqQTIGp0gptPRoHgALQc6m0YZjABSSLZThi%2BnFxEx0jkKUomzZJHhyEQN2QR1hxXheKBgzwXSyETp60oAG00q8pOgAPphRUkAD0AAFjVl1DaoEwRkTUBSpBT1mkALpiAC%2B9kg6HS0FidvY1rOyUdCow3sGUmQoMgYjDMbgSDQ6GwRHG9H0vUe6BAkaAA&tokens=false

Repro Code

import { Base, ListChunk } from '@ideamall/data-service';
import { ListModel, NewData } from 'mobx-restful';
import queryString from 'query-string';

export abstract class TableModel<
  D extends Base,
  F extends NewData<D> = NewData<D>
> extends ListModel<D, F> {
  async loadPage(pageIndex: number, pageSize: number, filter: F) {
    const { body } = await this.client.get<ListChunk<D>>(
      `${this.baseURI}?${queryString.stringify({
        ...filter,
        pageIndex,
        pageSize
      })}`
    );
    return { pageData: body!.list, totalCount: body!.count };
  }
}

IdeaMall/IdeaShop-miniapp@0ab7e17

ESLint Config

{
  "extends": ["taro/react"],
  "plugins": ["simple-import-sort"],
  "rules": {
    "import/first": "off",
    "simple-import-sort/imports": "error",
    "simple-import-sort/exports": "error",
    "@typescript-eslint/no-shadow": "off",
    "react/sort-comp": "off",
    "react/jsx-uses-react": "off",
    "react/react-in-jsx-scope": "off"
  }
}

tsconfig

{
  "compilerOptions": {
    "target": "es2017",
    "module": "commonjs",
    "removeComments": false,
    "preserveConstEnums": true,
    "moduleResolution": "node",
    "experimentalDecorators": true,
    "noImplicitAny": false,
    "allowSyntheticDefaultImports": true,
    "outDir": "lib",
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "strictNullChecks": true,
    "sourceMap": true,
    "baseUrl": ".",
    "rootDir": ".",
    "jsx": "react-jsx",
    "allowJs": true,
    "resolveJsonModule": true,
    "skipLibCheck": true,
    "typeRoots": ["node_modules/@types", "global.d.ts"]
  },
  "exclude": ["node_modules", "dist"],
  "compileOnSave": false
}

Expected Result

ESLint run with no crash in IdeaMall/IdeaShop-miniapp#45.

Actual Result

Oops! Something went wrong! :(

ESLint: 8.54.0

TypeError: Cannot read properties of undefined (reading 'length')
Occurred while linting ~/idea2app/IdeaMall/mini-app/src/store/Base.ts:9
Rule: "@typescript-eslint/no-useless-constructor"
    at ~/idea2app/IdeaMall/mini-app/node_modules/.pnpm/@typescript-eslint+eslint-plugin@6.12.0_@typescript-eslint+parser@6.12.0_eslint@8.54.0_typescript@5.2.2/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-useless-constructor.js:30:26
    at Array.some (<anonymous>)
    at checkParams (~/idea2app/IdeaMall/mini-app/node_modules/.pnpm/@typescript-eslint+eslint-plugin@6.12.0_@typescript-eslint+parser@6.12.0_eslint@8.54.0_typescript@5.2.2/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-useless-constructor.js:29:31)
    at MethodDefinition (~/idea2app/IdeaMall/mini-app/node_modules/.pnpm/@typescript-eslint+eslint-plugin@6.12.0_@typescript-eslint+parser@6.12.0_eslint@8.54.0_typescript@5.2.2/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-useless-constructor.js:52:21)
    at ruleErrorHandler (~/idea2app/IdeaMall/mini-app/node_modules/.pnpm/eslint@8.54.0/node_modules/eslint/lib/linter/linter.js:1091:28)
    at ~/idea2app/IdeaMall/mini-app/node_modules/.pnpm/eslint@8.54.0/node_modules/eslint/lib/linter/safe-emitter.js:45:58
    at Array.forEach (<anonymous>)
    at Object.emit (~/idea2app/IdeaMall/mini-app/node_modules/.pnpm/eslint@8.54.0/node_modules/eslint/lib/linter/safe-emitter.js:45:38)
    at NodeEventGenerator.applySelector (~/idea2app/IdeaMall/mini-app/node_modules/.pnpm/eslint@8.54.0/node_modules/eslint/lib/linter/node-event-generator.js:297:26)
    at NodeEventGenerator.applySelectors (~/idea2app/IdeaMall/mini-app/node_modules/.pnpm/eslint@8.54.0/node_modules/eslint/lib/linter/node-event-generator.js:326:22)
    at NodeEventGenerator.enterNode (~/idea2app/IdeaMall/mini-app/node_modules/.pnpm/eslint@8.54.0/node_modules/eslint/lib/linter/node-event-generator.js:340:14)
    at CodePathAnalyzer.enterNode (~/idea2app/IdeaMall/mini-app/node_modules/.pnpm/eslint@8.54.0/node_modules/eslint/lib/linter/code-path-analysis/code-path-analyzer.js:803:23)
    at ~/idea2app/IdeaMall/mini-app/node_modules/.pnpm/eslint@8.54.0/node_modules/eslint/lib/linter/linter.js:1126:32
    at Array.forEach (<anonymous>)
    at runRules (~/idea2app/IdeaMall/mini-app/node_modules/.pnpm/eslint@8.54.0/node_modules/eslint/lib/linter/linter.js:1121:15)
    at Linter._verifyWithoutProcessors (~/idea2app/IdeaMall/mini-app/node_modules/.pnpm/eslint@8.54.0/node_modules/eslint/lib/linter/linter.js:1370:31)
    at Linter._verifyWithConfigArray (~/idea2app/IdeaMall/mini-app/node_modules/.pnpm/eslint@8.54.0/node_modules/eslint/lib/linter/linter.js:1822:21)
    at Linter.verify (~/idea2app/IdeaMall/mini-app/node_modules/.pnpm/eslint@8.54.0/node_modules/eslint/lib/linter/linter.js:1452:65)
    at Linter.verifyAndFix (~/idea2app/IdeaMall/mini-app/node_modules/.pnpm/eslint@8.54.0/node_modules/eslint/lib/linter/linter.js:2083:29)
    at verifyText (~/idea2app/IdeaMall/mini-app/node_modules/.pnpm/eslint@8.54.0/node_modules/eslint/lib/cli-engine/cli-engine.js:254:48)
    at CLIEngine.executeOnFiles (~/idea2app/IdeaMall/mini-app/node_modules/.pnpm/eslint@8.54.0/node_modules/eslint/lib/cli-engine/cli-engine.js:834:28)
    at ESLint.lintFiles (~/idea2app/IdeaMall/mini-app/node_modules/.pnpm/eslint@8.54.0/node_modules/eslint/lib/eslint/eslint.js:551:23)
    at Object.execute (~/idea2app/IdeaMall/mini-app/node_modules/.pnpm/eslint@8.54.0/node_modules/eslint/lib/cli.js:402:36)
    at async main (~/idea2app/IdeaMall/mini-app/node_modules/.pnpm/eslint@8.54.0/node_modules/eslint/bin/eslint.js:152:22)

Additional Info

If I turn off this rule, the error disappears:

{
  "rules": {
    "@typescript-eslint/no-useless-constructor": "off",
  }
}

May be related with #7721.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingfix: out of date packagesuser was on an old version of our tooling or ESLint, updating fixed itpackage: eslint-pluginIssues related to @typescript-eslint/eslint-plugin

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions