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.
