- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在键入一个对象时遇到了一些问题,其中每个键都映射到一个通用值。
我已将我的代码简化为这个最小的可重现示例:
export type Action<T extends string, P> = {
type: T;
error: false;
payload: P;
};
type Event = { action: string; [trait: string]: string; };
type Handlers = {
[key: string]: <T extends string, P>(action: Action<T, P>) => Event;
};
export type ActionAType = Action<
"ACTION_A",
{ id: number; a: string; }
>;
export type ActionBType = Action<
"ACTION_B",
{ id: number; b: string }
>;
const HANDLERS: Handlers = {
"QUERY_GROUP_START": (action: ActionAType) => {
return { action: "START", a: action.payload.a };
},
"QUERY_GROUP_CONTINUE": (action: ActionBType) => {
return { action: "CONTINUE", id: action.payload.id };
}
};
我有一个
Action
泛型类型和该泛型类型的一些实例(
ActionA
、
ActionB
),我希望我的
Handlers
类型对应一个对象,其中每个元素都是一个通用键值对。
Type '(action: ActionAType) => { action: string; a: string; }' is not assignable to type '<T extends string, P>(action: Action<T, P>) => Event'.
Types of parameters 'action' and 'action' are incompatible.
Type 'Action<T, P>' is not assignable to type 'ActionAType'.
Types of property 'type' are incompatible.
Type 'T' is not assignable to type '"ACTION_A"'.
Type 'string' is not assignable to type '"ACTION_A"'.(2322)
我需要这种模式的原因是我在 Redux 中间件中有一组 Action 处理程序。
middleware
函数是这样工作的:
Action
) export const coreAnalytics = (
customHandlers: Handlers
) => () => (next: (action: Action) => void) => (action: Action) => {
const customHandler: (action: Action) => Event =
customHandlers[action.type];
if (customHandler) {
const analyticsEvent: Event = customHandler(action);
...
}
...
};
请注意,这里没有
Action
的联合类型。如果我们有这个,那么将其重写为一个打开 Action 类型并处理每个 Action 的函数将非常简单。
最佳答案
可以这样想:在 Handlers
类型的对象中,调用一个函数属性时的唯一保证是它的 action
参数将是一个 Action<T, P>
。 T
可以是任何 string
而 P
可以是任何东西。这使得在将属性分配给 Handlers
对象时要求任何更具体的保证是错误的。在您的两种情况下,您要求 action
专门为 ActionAType
和 ActionBType
,这意味着您要求 T
专门为 'ACTION_A'
和 'ACTION_B'
,而 P
专门为 { id: number; a: string; }
和 { id: number; b: string }
。这对于 Handlers
的输入方式来说太具体了。
我同意 Federkun 的观点,即最好的方法是不要明确输入 HANDLERS
。 (实际上,您可能根本不需要 Handlers
,甚至不需要作为别名。)如果没有显式类型,对象上的每个属性都有自己的窄类型,并提供有关 T
和 P
的相关保证。
如果您的完整代码有某种原因需要在 HANDLERS
上进行显式输入,那么您可能需要更新/扩展您的示例以反射(reflect)这一点。
关于typescript - 无法键入每个键映射到通用值的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67765647/
我通过 spring ioc 编写了一些 Rest 应用程序。但我无法解决这个问题。这是我的异常(exception): org.springframework.beans.factory.BeanC
我对 TestNG、Spring 框架等完全陌生,我正在尝试使用注释 @Value通过 @Configuration 访问配置文件注释。 我在这里想要实现的目标是让控制台从配置文件中写出“hi”,通过
为此工作了几个小时。我完全被难住了。 这是 CS113 的实验室。 如果用户在程序(二进制计算器)结束时选择继续,我们需要使用 goto 语句来到达程序的顶部。 但是,我们还需要释放所有分配的内存。
我正在尝试使用 ffmpeg 库构建一个小的 C 程序。但是我什至无法使用 avformat_open_input() 打开音频文件设置检查错误代码的函数后,我得到以下输出: Error code:
使用 Spring Initializer 创建一个简单的 Spring boot。我只在可用选项下选择 DevTools。 创建项目后,无需对其进行任何更改,即可正常运行程序。 现在,当我尝试在项目
所以我只是在 Mac OS X 中通过 brew 安装了 qt。但是它无法链接它。当我尝试运行 brew link qt 或 brew link --overwrite qt 我得到以下信息: ton
我在提交和 pull 时遇到了问题:在提交的 IDE 中,我看到: warning not all local changes may be shown due to an error: unable
我跑 man gcc | grep "-L" 我明白了 Usage: grep [OPTION]... PATTERN [FILE]... Try `grep --help' for more inf
我有一段代码,旨在接收任何 URL 并将其从网络上撕下来。到目前为止,它运行良好,直到有人给了它这个 URL: http://www.aspensurgical.com/static/images/a
在过去的 5 个小时里,我一直在尝试在我的服务器上设置 WireGuard,但在完成所有设置后,我无法 ping IP 或解析域。 下面是服务器配置 [Interface] Address = 10.
我正在尝试在 GitLab 中 fork 我的一个私有(private)项目,但是当我按下 fork 按钮时,我会收到以下信息: No available namespaces to fork the
我这里遇到了一些问题。我是 node.js 和 Rest API 的新手,但我正在尝试自学。我制作了 REST API,使用 MongoDB 与我的数据库进行通信,我使用 Postman 来测试我的路
下面的代码在控制台中给出以下消息: Uncaught DOMException: Failed to execute 'appendChild' on 'Node': The new child el
我正在尝试调用一个新端点来显示数据,我意识到在上一组有效的数据中,它在数据周围用一对额外的“[]”括号进行控制台,我认为这就是问题是,而新端点不会以我使用数据的方式产生它! 这是 NgFor 失败的原
我正在尝试将我的 Symfony2 应用程序部署到我的 Azure Web 应用程序,但遇到了一些麻烦。 推送到远程时,我在终端中收到以下消息 remote: Updating branch 'mas
Minikube已启动并正在运行,没有任何错误,但是我无法 curl IP。我在这里遵循:https://docs.traefik.io/user-guide/kubernetes/,似乎没有提到关闭
每当我尝试docker组成任何项目时,都会出现以下错误。 我尝试过有和没有sudo 我在这台机器上只有这个问题。我可以在Mac和Amazon WorkSpace上运行相同的容器。 (myslabs)
我正在尝试 pip install stanza 并收到此消息: ERROR: No matching distribution found for torch>=1.3.0 (from stanza
DNS 解析看起来不错,但我无法 ping 我的服务。可能是什么原因? 来自集群中的另一个 Pod: $ ping backend PING backend.default.svc.cluster.l
我正在使用Hibernate 4 + Spring MVC 4当我开始 Apache Tomcat Server 8我收到此错误: Error creating bean with name 'wel
我是一名优秀的程序员,十分优秀!