百度翻译为:“yield”表达式隐式生成“any”类型,因为其包含的生成器缺少返回类型注释

9,518 阅读2分钟

第一个片段是博主正在处理的代码,在model文件里,下面是它抛出的错误,它发生在代码中的每个“yield select”部分

项目中用到了redux-sage(redux-saga: redux中间件,旨在处理应用中的副作用, 官网: redux-saga.js.org

  effects: {
    *fetch({ payload }: any, { call }: any) {
      const response = yield call(QueryUsers, payload);
      return response;
    },
    
    *queryOrgChild({payload}: any, {call}: any) {
      const response = yield call(queryorgChildNodes, payload);
      return response;
    },

    *AddUser({ payload }: any, { call }: any) {
      const response = yield call(AddUser, payload);
      return response;
    },
}

'yield' expression implicitly results in an 'any' type because its containing generator lacks a return-type annotation.ts(7057)

报出的错误

select的文本类型(QueryUsers)与从yield返回的值无关。select(QueryUsers)是协同程序向其迭代上下文生成的值。

通过运行上下文(通过next()调用)注入生成器的值与从yield表达式返回的类型无关。

不管怎么说,当前Typescript根本没有关于它将获得什么的元数据,因为生成器函数没有类型注释。

典型的生成器函数类型注释类似于↓↓↓↓

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

function* myfun(): Generator<
  WhatYouYield,
  WhatYouReturn,
  WhatYouAccept
> {
const myYield = "foo" //myYield 类型就是 WhatYouYield
const myAccepted = yield myYield; //myAccepted 类型就是 WhatYouAccept
return "baz" //此值的类型是WhatYouReturn 
}

而您得到的错误是Typescript必须猜测whatyyouaccept类型,而函数上没有Generator类型注释。

话虽如此,众所周知redux-saga是Typescript之痛。因为生成器作为一个整体必须声明一次他们accepted + yielded的类型,即使redux-saga每次都想为您提供不同的类型,这取决于您yield的东西。有一种解决方法是使用委托yield,并通过键入信息对其进行注释-返回值的键入方式可以不同于yield+accept

总体来说,是因为博主在创建文件的时候,并没有对effects的内容进行类型设置, 只需要对effects中的每一个*进行类型定义即可。