Skip to content
← Back to rules

typescript/no-floating-promises 정확성

This rule is turned on by default when type-aware linting is enabled.
💭 This rule requires type information.
An auto-fix is available for this rule.

작동 방식

이 규칙은 타입스크립트 코드 내에서 "부유한" 프로미스를 금지합니다. 부유한 프로미스란 해석 또는 거부를 처리할 코드 없이 생성된 프로미스를 의미합니다.

이 규칙은 다음 방식으로 처리되지 않은 프로미스 값을 갖는 문장에 대해 보고합니다:

  • .then()을 두 개의 인자로 호출하는 경우
  • .catch()를 한 개의 인자로 호출하는 경우
  • await하는 경우
  • return하는 경우
  • void하는 경우

또한, 프로미스를 포함하는 배열이 생성되었으나 적절히 처리되지 않은 경우에도 보고합니다. 이를 해결하는 주요 방법은 위의 절차에 따라 하나의 프로미스를 생성하기 위해 프로미스 동시성 메서드 중 하나를 사용하는 것입니다. 이러한 메서드에는 다음이 포함됩니다:

  • Promise.all()
  • Promise.allSettled()
  • Promise.any()
  • Promise.race()

왜 문제가 되는가?

부유한 프로미스는 잘못된 순서로 실행되는 작업, 무시된 프로미스 거부 등 여러 문제를 일으킬 수 있습니다.

예시

이 규칙에 대한 잘못된 코드 예시:

ts
const promise = new Promise((resolve, reject) => resolve("value"));
promise;

async function returnsPromise() {
  return "value";
}
returnsPromise().then(() => {});

Promise.reject("value").catch();

Promise.reject("value").finally();

[1, 2, 3].map(async (x) => x + 1);

이 규칙에 대한 올바른 코드 예시:

ts
const promise = new Promise((resolve, reject) => resolve("value"));
await promise;

async function returnsPromise() {
  return "value";
}

void returnsPromise();

returnsPromise().then(
  () => {},
  () => {},
);

Promise.reject("value").catch(() => {});

await Promise.reject("value").finally(() => {});

await Promise.all([1, 2, 3].map(async (x) => x + 1));

구성

이 규칙은 다음 속성을 가진 구성 객체를 수락합니다:

allowForKnownSafeCalls

type: array

기본값: []

특정 호출을 무시하도록 허용하며, 타입이나 값 식별자로 지정합니다.

allowForKnownSafeCalls[n]

type: string

특정 선언과 일치하기 위한 타입 또는 값 식별자

다음 네 가지 유형의 식별자를 지원합니다:

  1. 문자열 식별자 (폐기됨): 이름 기반의 전역 매칭
json
"Promise"
  1. 파일 식별자: 로컬 파일 내에서 선언된 타입/값 매칭
json
{ "from": "file", "name": "MyType" }
{ "from": "file", "name": ["Type1", "Type2"] }
{ "from": "file", "name": "MyType", "path": "./types.ts" }
  1. 라이브러리 식별자: 타입스크립트 내장 라이브러리 타입 매칭
json
{ "from": "lib", "name": "Promise" }
{ "from": "lib", "name": ["Promise", "PromiseLike"] }
  1. 패키지 식별자: npm 패키지로부터의 타입/값 매칭
json
{ "from": "package", "name": "Observable", "package": "rxjs" }
{ "from": "package", "name": ["Observable", "Subject"], "package": "rxjs" }

allowForKnownSafePromises

type: array

기본값: []

특정 프로미스 타입을 무시하도록 허용하며, 타입이나 값 식별자로 지정합니다.

allowForKnownSafePromises[n]

type: string

특정 선언과 일치하기 위한 타입 또는 값 식별자

다음 네 가지 유형의 식별자를 지원합니다:

  1. 문자열 식별자 (폐기됨): 이름 기반의 전역 매칭
json
"Promise"
  1. 파일 식별자: 로컬 파일 내에서 선언된 타입/값 매칭
json
{ "from": "file", "name": "MyType" }
{ "from": "file", "name": ["Type1", "Type2"] }
{ "from": "file", "name": "MyType", "path": "./types.ts" }
  1. 라이브러리 식별자: 타입스크립트 내장 라이브러리 타입 매칭
json
{ "from": "lib", "name": "Promise" }
{ "from": "lib", "name": ["Promise", "PromiseLike"] }
  1. 패키지 식별자: npm 패키지로부터의 타입/값 매칭
json
{ "from": "package", "name": "Observable", "package": "rxjs" }
{ "from": "package", "name": ["Observable", "Subject"], "package": "rxjs" }

checkThenables

type: boolean

기본값: false

프로미스가 아닌 경우에도 .then()을 제공하는 객체(이름만 같아도 괜찮음)를 검사합니다.

ignoreIIFE

type: boolean

기본값: false

즉시 실행 함수 표현식 (IIFEs)을 무시합니다.

ignoreVoid

type: boolean

기본값: true

void 표현식으로 사용된 프로미스를 무시합니다.

사용 방법

이 규칙을 구성 파일 또는 커맨드라인에서 활성화하려면 다음과 같이 사용할 수 있습니다:

json
{
  "rules": {
    "typescript/no-floating-promises": "error"
  }
}
bash
oxlint --type-aware --deny typescript/no-floating-promises

참고 자료