typescript - 作为映射键的字符串枚举不适用于 ReturnType
问题描述
我正在尝试为functions
. 以下代码有效。
enum Enum {
Foo = "foo"
}
const functions = {
[Enum.Foo]: () => "Hello World!"
};
type FunctionMap = { [key: string]: (...args: any[]) => any };
type FunctionUnion<T extends FunctionMap> = ReturnType<T[keyof T]>;
type functions = FunctionUnion<typeof functions>;
但是,如果我更改 的键类型FunctionMap
,
type FunctionMap = { [key in Enum]: (...args: any[]) => any };
它抛出
类型 'T[keyof T]' 不满足约束 '(...args: any[]) => any'。类型 'FunctionMap[keyof T]' 不可分配给类型 '(...args: any[]) => any'.ts(2344)
为什么会抛出错误?
解决方案
您会收到枚举错误,因为索引签名[key: string]
意味着任何可以存在的属性都FunctionMap
必须是 type (...args: any[]) => any
。Enum
另一方面,映射类型意味着枚举中存在的属性必须是函数,该类型不保证其他属性。所以这是有效的:
enum Enum {
Foo = "foo"
}
const functions = {
[Enum.Foo]: () => "Hello World!",
otherProp: "string"
};
type FunctionMap = { [key in Enum]: (...args: any[]) => any };
type FunctionUnion<T extends FunctionMap> = ReturnType<T[keyof T]>;
type functions = FunctionUnion<typeof functions>; //ok here otherProp is not a problem
一种选择是使用条件类型过滤掉非函数类型:
enum Enum {
Foo = "foo"
}
const functions = {
[Enum.Foo]: () => "Hello World!",
otherProp: "string"
};
type FunctionMap = { [key in Enum]: (...args: any[]) => any };
type FunctionUnion<T extends FunctionMap> = {
[P in keyof T]: T[P] extends (...args: any[]) => any ? ReturnType<T[P]> : never;
}[keyof T]
type functions = FunctionUnion<typeof functions>;
推荐阅读
- django - 在 Django 中限制未经授权的访问
- python - Django - 如何在中间件文件中隐藏服务器 [HTTP 响应标头] 参数?
- javascript - 在 kendoDatepicker 中更改今天日期
- php - 将新对象插入对象树。如何?
- c++ - C++ 错误:无法转换 'Graph
::v_node*' 到 'v_node*' 在分配 - bash - 用于运行 C++ 二进制 N 次并将平均值输出到文件的 Bash 脚本
- javascript - 我还能如何在 javascript 中遍历 cts.search() 的结果?
- java - 如何将堆栈中的内容打印到文件中
- android - NDK 链接 C++ 库 .a 错误,没有存档符号表(运行 ranlib)
- node.js - 在 Nodejs 中使用 Azure Active Directory 连接到 SSMS SQL