Skip to content

Bug: [no-misused-promises] versus Promise.finally #10959

Open
@dmurvihill

Description

@dmurvihill

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.1.6&fileType=.tsx&code=IYZwngdgxgBAZgV2gFwJYHsLwgCgJQwDeAsAFAwzADuwqyMACgE7oC2qIApgHROcBWnKMhwBmPNzioIwADaywOUJFj4YAXgB8RAL54A3GR1A&eslintrc=N4KABGBEBOCuA2BTAzpAXGUEKQAIBcBPABxQGNoBLY-AWhXkoDt8B6Jge1oFtLlZkiACa1i0Dr0GoMkRNHHRI4MAF8QKoA&tsconfig=N4KABGBEDGD2C2AHAlgGwKYCcDyiAuysAdgM6QBcYoEEkJemy0eAcgK6qoDCAFutAGsylBm3TgwAXxCSgA&tokens=false

Repro Code

async function fn() {
  await Promise.reject(3).finally(async () => {});
}

ESLint Config

module.exports = {
  parser: "@typescript-eslint/parser",
  rules: {
    "@typescript-eslint/no-misused-promises": "error"
  },
};

tsconfig

{
	"exclude": ["**/node_modules"],
	"compilerOptions": {
		"target": "ES2022",
		"useDefineForClassFields": true,
		"module": "ES2022",
		"moduleResolution": "node",
		"resolveJsonModule": true,
		"allowJs": true,
		"checkJs": true,
		"declaration": true,
		"declarationMap": true,
		"sourceMap": true,
		"removeComments": true,
		"importHelpers": true,
		"downlevelIteration": true,
		"newLine": "LF",
		"isolatedModules": true,
		"verbatimModuleSyntax": true,
		"allowSyntheticDefaultImports": true,
		"esModuleInterop": true,
		"forceConsistentCasingInFileNames": true,
		"strict": true,
		"noUnusedLocals": false,
		"noUnusedParameters": false,
		"exactOptionalPropertyTypes": true,
		"noImplicitReturns": true,
		"noFallthroughCasesInSwitch": true,
		"noUncheckedIndexedAccess": true,
		"noImplicitOverride": true,
		"noPropertyAccessFromIndexSignature": true,
		"allowUnusedLabels": false,
		"allowUnreachableCode": false,
		"skipLibCheck": true
	}
}

Expected Result

OK

Actual Result

 Promise returned in function argument where a void return was expected  @typescript-eslint/no-misused-promises

Additional Info

This is a request to re-consider #7276.

The issue was closed with reference to the type definition of the onFinally callback:

interface Promise<T> {
  finally(onfinally?: (() => void) | undefined | null): Promise<T>
}

However, the type definition is erroneous and Microsoft has declined to fix it.

Based on the type definition, @bradzacher closed the issue because,

The rule is simply warning you that you're passing an async function into a place that won't handle the promise.

But the place in question does handle the promise:

onFinally

A function to asynchronously execute when this promise becomes settled. Its return value is ignored unless the returned value is a rejected promise. The function is called with no arguments.

It's unfortunate this problem has come to typescript-eslint from upstream, but please reopen #7276 until a solution can be found.

Metadata

Metadata

Assignees

No one assigned

    Labels

    accepting prsGo ahead, send a pull request that resolves this issuebugSomething isn't workingpackage: 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