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.
