第一个片段是博主正在处理的代码,在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中的每一个*进行类型定义即可。