javascript - 'yield'-uttrykk resulterer implisitt i en 'any'-type fordi generatoren det befinner seg i mangler en returtypeannotasjon


Det første utdraget er koden jeg jobber med, og nedenfor er feilen den gir, og det skjer på hver "yield select"-del som er i koden, og jeg er ikke sikker på hva mitt neste steg er.

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 bokstavelige typen til select(getPathname) relaterer seg ikke til verdien du får tilbake fra yield. select(getPathname) er verdien som blir yielded av din co-rutine til dens itererende kontekst.

Verdien som injiseres i generatoren din av dens kjørende kontekst (gjennom next()-kallet) BETYR noe for typen du får tilbake fra yield-uttrykket.

Uansett har TypeScript for øyeblikket ingen metadata om hva det kommer til å få i det hele tatt, siden generatorfunksjonen din ikke har noen typeannotasjon.

Jeg gjetter at dette er redux-saga.

En typisk typeannotasjon for en generatorfunksjon er noe som...

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 
}

...og feilen du får kommer av at Typescript må gjette typen WhatYouAccept uten Generator-typeannotasjonen på funksjonen din.

Svar #2

Jeg fikk samme feil, og jeg løste den.

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 nylige oppdateringer av TypeScript er det flere typerestriksjoner på generatorfunksjoner.

Type 1: avkastning med kall

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

Type 2: yield uten kall

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

Merk: Å bruke any er den raskeste løsningen, men den riktige løsningen ville være å lage en type/interface for responsen og bruke den som type.

Relaterte artikler