typescript “yield”表达式隐式导致“any”类型,因为其包含生成器缺少返回类型注解

vjrehmav  于 2023-03-24  发布在  TypeScript
关注(0)|答案(5)|浏览(309)

第一个片段是我正在使用的代码,下面是它抛出的错误,它发生在代码中的每个“yield select”部分,我不确定我的下一步是什么。

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;
u91tlkcl

u91tlkcl1#

select(getPathname)的文本类型与从yield返回的值无关。select(getPathname)是协同例程向其迭代上下文生成的值。
由生成器的运行上下文(通过next()调用)注入到生成器中的值与从yield表达式返回的类型有关。
无论哪种方式,目前Typescript根本没有关于它将得到什么的元数据,因为生成器函数没有类型注解。
我猜这是一部终极传奇。
典型的Generator函数类型注解类似于...

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 
}

...你得到的错误是来自Typescript必须猜测WhatYouAccept类型,而你的函数上没有Generator类型注解。

lrpiutwd

lrpiutwd2#

我得到了同样的错误,我解决了它。

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)
ivqmmu1c

ivqmmu1c3#

在最近的typescript更新中,对生成器函数有更多的类型限制。

类型1:买入即收益

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

类型2:无赎回收益

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

**注意:**使用any是最快的解决方案,但正确的解决方案是为响应创建类型/接口并将其用作类型。

eh57zj3b

eh57zj3b4#

您可以添加任何作为返回类型

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

  interface Params {
    hastag: string;
  }
k4aesqcs

k4aesqcs5#

我也遇到了这个问题,通过将返回值类型设置为any解决了这个问题。

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

相关问题