Typescript-kompilatorn kan inte härleda typen från ett Promise-resolve-anrop


När du använder följande kodsnutt kan kompilatorn inte identifiera typerna för item1, den kommer att tilldela som okänd (se när du hovrar över variabelnamnet på Typescript Playground)

Varför kan inte TypeScript-kompilatorn härleda att typen kommer att vara en sträng?

    const getItem = () =>
      new Promise((resolve) => {
        return resolve('a title');
      });
    
    (async function() {
      const item1 = await getItem();
      const item2 = await getItem();
    })();

Svar #1

Problemet är att typen av Promise inte kan härledas från typen som skickas till resolve-metoden. Resolve-metoden får sin typ från den generiska typ som skickas till Promise-konstruktorn, inte tvärtom. Dessutom behöver du inte använda return med resolve i det här fallet.

Du kan ta itu med detta på ett av två sätt.

  1. Du bör skicka string som den generiska typparametern. Använd Promise<string>((resolve) => { ..., vilket kommer att tala om för TypeScript att du förväntar dig att en sträng skickas till resolve-funktionen. Du kommer att se ett typfel om du försöker kalla resolve med något annat.
  2. Du kan använda en konstruktion som Promise.resolve('a title'); om du egentligen inte väntar på något och bara vill lägga in en sträng i ett löfte. På det sättet kan den generiska typparametern härledas.

Relaterade artiklar