reactjs - React Redux Saga 与 Typescript 错误属性不存在
问题描述
首次使用 TS 设置 React, Next js 应用程序并获得成功。
TS 在redux-saga
设置时抛出以下错误:
类型“输入”上不存在属性“名称”| DataPost问候语 | ErrorPostGreeting'。“DataPostGreeting”类型上不存在属性“名称”
正确的是name
type 上不存在DataPostGreeting
,这是成功响应的类型,但它确实存在于Input
有问题的操作是在测试应用程序上创建问候语的 POST。
我以为我已经正确输入了作为问候语的有效载荷Input
,name
但 TS 似乎对此并不满意。即使它确实识别 Input
为适用类型的一部分。
这是突出显示错误触发器的传奇:
/store/sagas/greetings.ts
import { all, call, put, takeLatest } from 'redux-saga/effects';
import { actionPostGreetingOk, actionPostGreetingError } from '../actions/creators';
import { Actions } from '../actions/names';
import { ActionTypes } from '../actions/types';
import { apiQl } from 'lib/functions';
function* postGreeting(action: ActionTypes) {
const queryQl = `mutation createGreeting(
$name: String!
) {
createGreeting(input: {
name: $name
}) {
greeting {
id
}
}
}`;
const variables = {
name: action.payload.name, // *** ERROR IS THROWN HERE ***
};
try {
const data = yield call(apiQl, queryQl, variables);
if (data.errors) {
yield put(
actionPostGreetingError({
error: data.errors,
}),
);
} else {
yield put(
actionPostGreetingOk({
greeting: data.data.createGreeting,
}),
);
}
} catch (error) {
if (error.response === undefined || error.code === 'ECONNABORTED') {
console.log('ERROR RESPONSE UNDEFINED, ABORTED');
}
}
export default function* greeting() {
yield all([takeLatest(Actions.POST_GREETING, postGreeting)]);
}
在类型文件上:
...
export interface Input {
name: string;
}
export interface ActionPostGreeting {
type: typeof Actions.POST_GREETING;
payload: Input;
}
...
export type ActionTypes =
| ActionPostGreeting
| ActionPostGreetingInit
| ActionPostGreetingOk
| ActionPostGreetingError
| ActionHydrate;
动作创建者:
export const actionPostGreeting = (payload: Input): ActionPostGreeting => {
return {
type: Actions.POST_GREETING,
payload,
};
};
解决方案
您将整个ActionTypes
联合传递给您的传奇,但您的函数应该只采用特定的有效负载类型(例如ActionPostGreeting
)。否则,这意味着您的 saga 可以使用任何有效负载调用,要解决您的问题,您可以像这样限制类型:
function* postGreeting(action: ActionPostGreeting) {
// do stuff
const variables = {
name: action.payload.name, // will be good
};
}
推荐阅读
- timescaledb - 如何在 timescaleDB 中执行 merge_asof?
- r - 如何将proc混合从SAS转换为R-非结构化协方差
- docker - Docker:来自守护程序的错误响应:创建临时租约时出错
- java - 使用 Java Mail API 创建 S/MIME
- javascript - 根据匹配的类和内容隐藏和显示 DIV
- reactjs - 如何防止 React / React Native 在 React Native 调试器中自动将堆栈跟踪附加到我的控制台警告
- docker - 如何授予非特权用户在节点 docker 容器中运行 conda 的访问权限?
- string - grep 找到文件后文件没有被复制
- regex - 为什么这个 sed 表达式没有按预期删除带有韩语的行?
- swift - 如何在我的 podspec 中使用 TensorFlow 实验框架?