javascript - 'yield'-uttryck resulterar implicit i en 'any'-typ eftersom den innehållande generatorn saknar en returtypannotation


Det första utdraget är koden jag arbetar med och nedan är felet det ger, och det händer på varje "yield select"-del som finns i koden och jag är inte säker på vad mitt nästa steg är.

function* onLoadingDomainsresult() {
  const pathname = yield select(getPathname);

  interface Params {
    hastag: string;
  }

'yield' expression implicitly results in an 'any' type because its containing generator lacks a return-type annotation.  TS7057

    113 | 
    114 | function* onLoadingDomainsresult() {
  > 115 |   const pathname = yield select(getPathname);
        |                    ^
    116 | 
    117 |   interface Params {
    118 |     hastag: string;

Svar #1

Den literala typen av select(getPathname) relaterar inte till värdet du får tillbaka från yield. select(getPathname) är värdet som din korutin returnerar till sin itererande kontext.

Värdet som injiceras i din generator av dess körande kontext (genom next()-anropet) BETYDER något för vilken typ du får tillbaka från yield-uttrycket.

Hur som helst har Typescript för närvarande ingen metadata om vad det kommer att få alls, eftersom din generatorfunktion inte har någon typannotering.

Jag gissar att detta är redux-saga.

En typisk typannotering för en generatorfunktion är något i stil med...

type WhatYouYield="foo"
type WhatYouReturn="bar"
type WhatYouAccept="baz"

function* myfun(): Generator<
  WhatYouYield,
  WhatYouReturn,
  WhatYouAccept
> {
const myYield = "foo" //type of myYield is WhatYouYield
const myAccepted = yield myYield; //type of myAccepted is WhatYouAccept
return "baz" //type of this value is WhatYouReturn 
}

...och felet du får beror på att Typescript måste gissa vilken typ WhatYouAccept har utan typannoteringen Generator på din funktion.

Svar #2

Jag fick samma fel och jag löste det.

export interface ResponseGenerator{
    config?:any,
    data?:any,
    headers?:any,
    request?:any,
    status?:number,
    statusText?:string
}
const response:ResponseGenerator = yield YOUR_YIELD_FUNCTION
console.log(response.data)

Svar #3

I de senaste uppdateringarna av TypeScript finns det fler typbegränsningar för generatorfunktioner.

Typ 1: avkastning med köpoption

function* initDashboard(): any {
  let response = yield call(getDashboardData);
  console.log(response);
}

Typ 2: yield utan anrop

function* initDashboard() {
  let response: any = yield getDashboardData;
  console.log(response);
}

Observera: Att använda any är den snabbaste lösningen men den korrekta lösningen skulle vara att skapa en typ/interface för svaret och använda det som typ.

Relaterade artiklar