枚举出现错误,因为索引签名
[key: string]
意味着任何可以存在的财产
FunctionMap
必须是
(...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>;