Typescript: setTimeout-μ‹œκ°„ 초과 IDλ₯Ό λ³€μˆ˜μ— ν• λ‹Ήν•˜λ©΄ 였λ₯˜ TS2323이 λ°œμƒν•©λ‹ˆλ‹€. 'Timer'μœ ν˜•μ€ 'number'μœ ν˜•μ— ν• λ‹Ή ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

에 λ§Œλ“  2014λ…„ 10μ›” 07일  Β·  24μ½”λ©˜νŠΈ  Β·  좜처: microsoft/TypeScript

tsc v1.1.0-1을 μ‚¬μš©ν•˜λ©΄ 컴파일 ν•  λ•Œ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.
였λ₯˜ TS2323 : '타이머'μœ ν˜•μ€ '숫자'μœ ν˜•μ— ν• λ‹Ή ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

λ‹€μŒ μ½”λ“œλŠ” 컴파일 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚΅λ‹ˆλ‹€.

this.sTimeout = setTimeout (() => this.showDelay (), 250);

sTimeout은 숫자 (개인 var)둜 μ •μ˜λ©λ‹ˆλ‹€.

Question

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

λŒ€μ‹  window.setTimeout μ‚¬μš©ν•˜μ‹­μ‹œμ˜€.

λͺ¨λ“  24 λŒ“κΈ€

μ™„μ „ν•œ 예λ₯Ό κ²Œμ‹œν•˜μ‹­μ‹œμ˜€. μ§€κΈˆκΉŒμ§€ 제곡된 μ •λ³΄λ‘œλŠ” 문제λ₯Ό μž¬ν˜„ν•˜κΈ°μ— μΆ©λΆ„ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

class Foo {
    private sTimeout: number;
    showDelay() { }
    bar() {
        setTimeout(() => this.showDelay(), 250);
    }
}

Timer λΌλŠ” λ‚΄μž₯ μœ ν˜•μ΄ μ—†μœΌλ―€λ‘œ ν˜ΈμΆœμ€‘μΈ setTimeout 이 window.setTimeout κ°€ 아닐 κ°€λŠ₯성이 λ†’μŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ—ˆμ–΄μ•Όν–ˆλŠ”λ°-쑰금 더 일찍 μ„œλ‘λ₯΄κ³  μžˆμ—ˆλ‹€. μ—¬κΈ° μžˆμŠ΅λ‹ˆλ‹€ :

class Foo {
    private sTimeout: number; // Storing Timeout ID - to clear it - if needed
    private showDelay() { }
    constructor() {
        this.sTimeout = setTimeout(() => this.showDelay(), 250);
    }
}

λ‹€μŒ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

tsc v1.1.0-1 μ‚¬μš©
/tests/Foo.ts(5,3) : 였λ₯˜ TS2323 : '타이머'μœ ν˜•μ€ '번호'μœ ν˜•μ— ν• λ‹Ή ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

μ§€κΈˆμ€ sTimeout을 μž…λ ₯ν•˜μ—¬ μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€.

이것은 λ‚˜λ₯Ό μœ„ν•΄ μž¬ν˜„λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. F12 setTimeout μ–΄λ–»κ²Œ λ˜λ‚˜μš”?

F12κ°€ 무엇을 μ˜λ―Έν•˜λŠ”μ§€ 잘 λͺ¨λ₯΄μ‹œκ² μŠ΅λ‹ˆκΉŒ? .

"μ •μ˜λ‘œ 이동"

λ‹€μ‹œ λ§ν•˜μ§€λ§Œ Timer λΌλŠ” λ‚΄μž₯ μœ ν˜•μ΄ μ—†μœΌλ―€λ‘œ μ½”λ“œκ°€ λ‹€λ₯Έ μœ ν˜•μ„ μ°Έμ‘°ν•΄μ•Όν•©λ‹ˆλ‹€. νŒŒμΌμ—μ„œ 예제λ₯Ό λ‹¨λ…μœΌλ‘œ μ‹œλ„ν•˜κ±°λ‚˜ ν”„λ‘œμ νŠΈμ—μ„œ Timer 좜처λ₯Ό νŒŒμ•…ν•˜μ‹­μ‹œμ˜€. setTimeout κ°€ κΈ°λ³Έ 제곡 ν•¨μˆ˜κ°€ μ•„λ‹ˆλΌ λ‹€λ₯Έ λ°˜ν™˜ 값을 가진 λ‹€λ₯Έ μ‚¬μš©μž μ •μ˜ ν•¨μˆ˜λ₯Ό μ°Έμ‘°ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

자체적으둜 예제λ₯Ό μ‹œλ„ν–ˆμŠ΅λ‹ˆλ‹€. λ‚΄ 도ꡬ 체인 λ˜λŠ” λ‹€λ₯Έ μ½”λ“œμ˜ ꡬ성 μš”μ†Œλ‘œ 인해 λ°œμƒν•œ 것 κ°™μŠ΅λ‹ˆλ‹€. μ‹œκ°„μ„λ‚΄μ–΄ μ£„μ†‘ν•©λ‹ˆλ‹€. κ°μ‚¬ν•©λ‹ˆλ‹€ ... λ‹«νž˜ ...

미래의 λ…μžλ₯Ό μœ„ν•΄ node.js의 λͺ…ν™•ν•œ μ •μ˜λ‘œ 인해이 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. 해결책은 μœ ν˜•μ˜ 전체 이름을 μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. NodeJS.Timer μ•„λ‹ˆλΌ Timer NodeJS.Timer Timer (μŠ¬ν”„κ²Œλ„ Typescript 트랜슀 νŒŒμΌλŸ¬κ°€ μ œμ•ˆν•œ 것이며 μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€).

@jdfreder time

μ–΄μ¨Œλ“  λ™μΌν•œ λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. error TS2352: Neither type 'Timer' nor type 'number' is assignable to the other. 파일 맨 μœ„μ— μ•”μ‹œ 적 μ°Έμ‘°κ°€ μ •μ˜λ˜μ–΄ μžˆμ§€λ§Œ /// <reference path="node_modules/typescript/lib/lib.d.ts" /> μ—¬μ „νžˆ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

주된 λ¬Έμ œλŠ” 타사 npm νŒ¨ν‚€μ§€ (angular2) 쀑 ν•˜λ‚˜μ— TS + 타이핑 (λ…Έλ“œ 및 기타)이 νŒ¨ν‚€μ§€μ— ν¬ν•¨λ˜μ–΄ μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

@rixrix (그리고 이것을 λ°œκ²¬ν•˜λŠ” λ‹€λ₯Έ μ‚¬λžŒμ„ μœ„ν•΄) λ‚˜λŠ” μ˜¬λ°”λ₯Έ 맀개 λ³€μˆ˜λ₯Ό μ „λ‹¬ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 것을 깨달을 λ•ŒκΉŒμ§€ λΉ„μŠ·ν•œ λ¬Έμ œκ°€μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

두 번째 맀개 λ³€μˆ˜ ms κ°€ ν•„μš”ν•˜κ³  NodeJS.Timer λ°˜ν™˜ν•˜λŠ”μ΄λ₯Ό λΉ„κ΅ν•©λ‹ˆλ‹€.

function setTimeout(callback: (...args: any[]) => void, ms: number, ...args: any[]): NodeJS.Timer;

... 그리고 이것은 두 번째 맀개 λ³€μˆ˜ timeout μ„ νƒμ μœΌλ‘œ λ§Œλ“€κ³  number λ°˜ν™˜ν•©λ‹ˆλ‹€.

function setTimeout(handler: any, timeout?: any, ...args: any[]): number;

이 두 κΈ°λŠ₯을 기반으둜 TSλŠ” μ μ ˆν•œ μ˜€λ²„λ‘œλ“œλ₯Ό μ˜¬λ°”λ₯΄κ²Œ μ„ νƒν•˜λ―€λ‘œ error TS2352: Neither type 'Timer' nor type 'number' is assignable to the other κ°€ λ°œμƒν•˜λ©΄ μ‹œκ°„ μ œν•œμ„ μ§€μ •ν•΄μ•Όν•©λ‹ˆλ‹€!

μ•ˆλ…•ν•˜μ„Έμš” @ Penryn κ°μ‚¬ν•©λ‹ˆλ‹€!

이전 μ˜κ²¬μ€ ν•΄λ‹Ή 였λ₯˜ λ©”μ‹œμ§€μ— λŒ€ν•œ μ •ν™•ν•œ μ„ΈλΆ€ 정보λ₯Ό 더 이상 κΈ°μ–΅ν•  수 μ—†κΈ° λ•Œλ¬Έμ— μΆ©λΆ„ν•œ μ„ΈλΆ€ 정보λ₯Ό μ œκ³΅ν•˜μ§€ μ•Šμ•˜λ‹€λŠ” 증거라고 μƒκ°ν•©λ‹ˆλ‹€. μ£„μ†‘ν•©λ‹ˆλ‹€.

제 머리 μœ„μ— μš°λ¦¬κ°€ 이전에 κ²ͺμ—ˆλ˜ λ¬Έμ œλŠ” Angular2 (μ•ŒνŒŒ 릴리슀)둜 μž‘μ„±λœ μŠ€ν•€ μ˜€ν”„ μ›Ή 앱을 μ μ§„μ μœΌλ‘œ μ—…κ·Έλ ˆμ΄λ“œ ν•  λ•Œμ˜€μŠ΅λ‹ˆλ‹€. 우리의 μ£Όμš” μ½”λ“œλ² μ΄μŠ€ (ng1 및 ng2)λŠ” TypeScript (bower ꡬ성 μš”μ†Œ, λ‹€λ₯Έ 타이핑, λͺ‡ 가지 μ‚¬μš©μž 지정 타이핑 포함)둜 μž‘μ„±λ˜μ—ˆμœΌλ©°, λ‹Ήμ‹œ Angular2λŠ” 타이핑, λ…Έλ“œ 타이핑 등도 μ œκ³΅ν–ˆμŠ΅λ‹ˆλ‹€. λ…Έλ“œ 타이핑 (ꡬ식 버전) 및 ng2 λ…Έλ“œ μœ ν˜• (및 κ°€λŠ₯ν•œ λ‹€λ₯Έ μœ ν˜•), 효과적으둜 TS μ»΄νŒŒμΌλŸ¬λŠ” dups μœ ν˜•μ— λŒ€ν•΄ ν˜Όλž€μŠ€λŸ¬μ›Œν•©λ‹ˆλ‹€. 우리의 κ²½μš°μ—λŠ” λ¬Έμ œκ°€λ˜λŠ” 타이핑을 μˆ˜λ™μœΌλ‘œ μˆ˜μ •ν•  수 μžˆμ§€λ§Œ μ΅œμ‹  버전을 κ°€μ Έμ™€μ•Όν•œλ‹€λŠ” 점을 μ•„λŠ” 것은 λ„ˆλ¬΄ λ§Žμ€ μž‘μ—…μž…λ‹ˆλ‹€.

ν•„μš”ν•œ 타이핑을 μˆ˜λ™μœΌλ‘œ μ„€μΉ˜ν•΄μ•Όν•˜λ―€λ‘œ 졜근 Angular2 λ¦΄λ¦¬μŠ€μ—μ„œμ΄ λ¬Έμ œκ°€ ν•΄κ²°λ˜μ—ˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

건배

@RyanCavanaugh μ—λŠ” λ™μΌν•œ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. setTimeout에 λŒ€ν•΄ 두 가지 μ •μ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€. ν•˜λ‚˜λŠ” number λ₯Ό λ°˜ν™˜ν•˜κ³  λ‹€λ₯Έ ν•˜λ‚˜λŠ” NodeJS.Timer λ°˜ν™˜ν•©λ‹ˆλ‹€.

λŒ€μ‹  window.setTimeout μ‚¬μš©ν•˜μ‹­μ‹œμ˜€.

NodeJS.Timer 에 특수 μœ ν˜•μ΄ ν•„μš”ν•œ μ΄μœ λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ? μ—¬μ „νžˆ number λ₯Ό λ°˜ν™˜ ν•  κ²ƒμž…λ‹ˆλ‹€. λ‚΄κ°€ λ­”κ°€λ₯Ό λ†“μΉ˜κ³  μžˆμŠ΅λ‹ˆκΉŒ?

@cchamberlain λ…Έλ“œλŠ” μ‹€μ œλ‘œ 전체 Timer 클래슀λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€ : https://nodejs.org/api/timers.html

이 κ²½μš°μ—λŠ” number 만이 μ•„λ‹™λ‹ˆλ‹€.

@Penryn -TIL πŸ‘

κΆκΈˆν•œ μ‚¬λžŒλ“€μ„ μœ„ν•΄ 이것이 μΌμ–΄λ‚˜λŠ” μ΄μœ λŠ” node.js의 setTimeout κ°€ λΈŒλΌμš°μ € λ‚΄μ—μ„œ setTimeout 와 λ‹€λ₯Έ 것을 λ°˜ν™˜ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. λΈŒλΌμš°μ €μ˜ setTimeout은 숫자 만 λ°˜ν™˜ν•©λ‹ˆλ‹€. node.jsμ—μ„œ setTimeout은 큰 Timer 객체λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

λ”°λΌμ„œμ΄ λ¬Έμ œκ°€ λ°œμƒν•˜λŠ” μ΄μœ λŠ” 웹을 λŒ€μƒμœΌλ‘œν•˜λ €κ³ ν–ˆμ§€λ§Œ λ…Έλ“œ μ •μ˜λ₯Ό κ°€μ Έ μ™”κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

@johnfn 은 λΈŒλΌμš°μ €μ™€ λ…Έλ“œλ₯Ό λŒ€μƒμœΌλ‘œν•˜λŠ” λ™ν˜• μ½”λ“œ 일 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

setTimeout λ˜λŠ” setInterval λ₯Ό μ‚¬μš©ν•˜μ—¬ 여기에 μ˜€λŠ” λ‹€λ₯Έ μ‚¬μš©μžμ˜ 경우 window.setTimeout λ˜λŠ” interval ν•˜μ—¬ tscμ—μ„œ μ‚¬μš©μžκ°€ μ›Ή λΈŒλΌμš°μ €μ˜ ν•¨μˆ˜ (숫자 λ°˜ν™˜ ) 및 NodeJS의 ν•¨μˆ˜ (λ‹€λ₯Έ 것을 λ°˜ν™˜)κ°€ μ•„λ‹™λ‹ˆλ‹€.

@AskYous 에 μΆ”κ°€ν•˜λ €λ©΄ νŒ¨ν‚€μ§€μ— @types/node μ΄μžˆλŠ” 경우 window.setInterval λ₯Ό μ‚¬μš©ν•˜μ—¬ μœ ν˜• 였λ₯˜λ₯Ό λ°©μ§€ν•˜μ‹­μ‹œμ˜€.

μ‚¬μš©ν•˜λŠ” μ‚¬λžŒμ˜ 경우 @angular 가진 @angular-cli λ‹Ήμ‹ μ˜ μœ ν˜• λ…Έλ“œκ°€ μžˆλŠ”μ§€ ν™•μΈν•˜μ—¬ tsconfig.app.json 뿐만 μ•„λ‹ˆλΌ.

Eq :

tsconfig.app.json

{
  "extends": "../tsconfig.json",
  "compilerOptions": {
    "outDir": "../out-tsc/app",
    "module": "es6",
    "baseUrl": "",
    "types": ["node"] --> ADD THIS
  },
  "exclude": [
    "test.ts",
    "**/*.spec.ts"
  ]
}

μ—¬κΈ°μ—μ„œ μ°Ύμ•˜μŠ΅λ‹ˆλ‹€ : https://stackoverflow.com/a/43952363/3415716

이름이 setTimeout() ν•¨μˆ˜κ°€μžˆλŠ” νŒ¨ν‚€μ§€λ₯Ό κ°€μ Έ 왔을 수 μžˆμŠ΅λ‹ˆλ‹€.
κ·Έλƒ₯ μ‚¬μš© window.setTimeout λŒ€μ‹  setTimeout 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ :)

λ…Έλ“œ ν™˜κ²½ μœ ν˜•μ€ NodeJS.Timer global.setTimeout
λΈŒλΌμš°μ € ν™˜κ²½μ—μ„œ number μ‚¬μš© window.setTimeout

였늘 npm i @types/react @types/react-dom --save-dev μ„€μΉ˜ ν›„

@types\node κ°€ node_modules 둜 μœ μΆœλ˜μ–΄ Timer 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

@ nippur72 처럼, μ €λŠ” react-dom 였늘 이것을 λ§Œλ‚¬μŠ΅λ‹ˆλ‹€. κ°€μž₯ κ°„λ‹¨ν•œ 해결책은 λΈŒλΌμš°μ € ν™˜κ²½μ΄ μ˜ˆμƒ 될 λ•Œ Node에 μ˜μ‘΄ν•˜μ§€ μ•Šλ„λ‘ @types νŒ¨ν‚€μ§€λ₯Ό μ—…λ°μ΄νŠΈν•˜λŠ” κ²ƒμ΄λ―€λ‘œ https://github.com/DefinitelyTyped/DefinitelyTyped/issues/21310#issuecomment -367919251

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰