reactjs - Utilizarea setInterval() în Typescript React


Încerc să convertesc un exemplu de cronometru bazat pe React în Typescript.

Clasa arată puțin așa:

export class Container extends
    Component<IProps, IState> {

    private timerID: NodeJS.Timeout | undefined;  // stops a warning in DidMount

    constructor(props: IRevovlingContainerProps) {
        super(props);
        this.state = { date: new Date() } as any;
    }

    componentDidMount() {
        this.timerID = setInterval(
            () => this.tick(),
            1000
        );
    }

    componentWillUnmount() {
        clearInterval(this.timerID);  // error here on this.timerID
    }

    // ...

În componentWillUnmount() this.timerID are o eroare:

[ts] Argumentul de tip 'Timeout | undefined' nu poate fi atribuit parametrului de tip 'number | undefined'. Tipul 'Timeout' nu poate fi atribuit tipului 'number'. [2345]

Am verificat index.d.ts, care declară clearInterval():

declare function clearInterval(intervalId: NodeJS.Timeout): void;

Se pare că trec un argument de tip corect în clearInterval() și totuși acesta așteaptă un număr. Ce ar trebui să trec, vă rog?

Editare: dacă îmi schimb declarația timerID apare o eroare în this.timerID în componentDidMount():

private timerID: number | undefined; 
Type 'Timeout' is not assignable to type 'number'.

Răspuns #1

NodeJS.Timeout este destinat să fie folosit atunci când rulezi în mediul node. Deoarece vrei să folosești API-urile browserului, va trebui să folosești number ca tip pentru timerID.

De asemenea, funcțiile încorporate nu ar trebui să-și rezolve tipurile din definițiile tipului node, în cazul tău. Dacă ai @types/node instalat, te rugăm să-l dezinstalezi dacă nu este necesar. Acesta poate intra în conflict cu tipurile pe care trebuie să le folosești.

Răspunsul #2

React folosește setInterval-ul standard din JavaScript, care returnează un număr. Verifică setInterval pe MDN

IntervalulID returnat este o valoare numerică, nenulă

Totuși, tipul de returnare la care te referi, NodeJS.Timeout, este cel returnat de setInterval-ul din Node. Acesta este specific pentru Node.js.

Clasă: Timeout:

"Acest obiect este creat intern și este returnat de setTimeout() și setInterval()"

Timeout nu poate fi atribuit unui număr înseamnă că declarați tipul așteptat ca Timeout al Node-ului, iar ceea ce este primit efectiv este un număr.