codememo

TypeScript의 setTimeout에 사용할 반환 유형을 선택하십시오.

tipmemo 2023. 4. 3. 21:32
반응형

TypeScript의 setTimeout에 사용할 반환 유형을 선택하십시오.

다음 코드를 고려하십시오.

const timer: number = setTimeout(() => '', 1000);

타이프스크립트가 다음 오류를 발생시킵니다.Type 'Timer' is not assignable to type 'number'.퀵 룩업을 통해 알 수 있듯이setTimeout돌아온다NodeJS.Timer.

하지만 브라우저 기반 개발을 하는 경우NodeJS.Timer기분이 안 좋아올바른 유형 정의와 반환 유형은 무엇입니까?setTimeout의지하지 않고 일하다any신고할 수 있습니까?

가장 간단한 해결책은 유형을 전혀 지정하지 않고 유형 추론이 작동하도록 허용하는 것입니다.유형을 지정해야 하는 경우 브라우저 선언과 노드 선언 간에 유형이 일치하지 않으므로 다음을 사용할 수 있습니다.ReturnType변수 유형이 반환 유형이 무엇이든 지정한다.setTimeout다음과 같습니다.

const timer: ReturnType<typeof setTimeout> = setTimeout(() => '', 1000);

또,window.setTimeout뿐만 아니라 사용할 수도 있습니다.setTimeout올바른 반환 유형을 반환합니다.

사용할 수 있습니다.window.setTimeout타입을 반환한다.number.

let a: number;
a = window.setTimeout(function() {}, 0);

이것은 Typescript가 아래의 모든 유형 정의를 검색하기 때문에 발생합니다.node_modules/@types

노드를 설치한 경우JS 유형 정의(많은 npm 패키지와 함께 제공됨)는~/node_modules/@types/node/globals.ts그리고 당신의 프로젝트는~/Projects/myproject, NodeJS 정의setTimeout새요.

기본적으로는 표시되는 모든 "@types" 패키지가 컴파일에 포함됩니다.엔클로징 폴더의 node_modules/@types 내의 패키지는 표시되는 것으로 간주됩니다.구체적으로는 ./node_modules/@types/, ../../node_modules/@types/ 등의 패키지를 의미합니다.

참조: https://www.typescriptlang.org/tsconfig#types

Typescript가 사용자 지정 유형 정의를 찾으면 기본 유형 정의보다 우선됩니다.set Timeout()의 VS Code 2 유형 정의

솔루션:

  • 컴파일러 유형 정의를 검색할 경로 지정 옵션:"typeRoots":[]
  • 컴파일러 기본 경로에서 로드할 정의 유형을 지정합니다."types": []
  • 기본 검색 경로에서 정의 파일 제거

회피책:

  • 사용하다window.setTimeout()대신

window.setTimeout돌아온다number이상적으로는, 독자적인 타입을 정의해 번호와 구별하는 것(또, 다음과 같은 조작을 회피하는 것)이 필요합니다.+타이머에게는 의미가 없습니다).

type TimerHandle = number;

이 에러가 발생한 다른 사용자는 tsconfig.js 파일에 다음과 같이 추가합니다.

"compilerOptions": {

   ...
   "types": [],
}

저 같은 경우에는 노드 내에서 작업하고 있었기 때문에NodeJS.Timeout

언급URL : https://stackoverflow.com/questions/51040703/what-return-type-should-be-used-for-settimeout-in-typescript

반응형