Typescript 字符串枚举作为映射键不适用于ReturnType
我正在尝试为Typescript 字符串枚举作为映射键不适用于ReturnType,typescript,Typescript,我正在尝试为函数分配类型。下面的代码可以工作 enum Enum { Foo = "foo" } const functions = { [Enum.Foo]: () => "Hello World!" }; type FunctionMap = { [key: string]: (...args: any[]) => any }; type FunctionUnion<T extends FunctionMap> = ReturnType<T[keyo
函数
分配类型。下面的代码可以工作
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>;
它抛出
类型“T[keyof T]”不满足约束“(…args:any[])=>any”。
类型“FunctionMap[keyof T]”不可分配给类型“(…args:any[])=>any'.ts(2344)
它为什么会抛出错误?您会在枚举中得到一个错误,因为索引签名
[key:string]
意味着FunctionMap
上可能存在的任何属性都必须是类型(…args:any[])=>any
。另一方面,Enum
上的映射类型意味着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枚举{
Foo=“Foo”
}
常量函数={
[Enum.Foo]:()=>“你好,世界!”,
其他属性:“字符串”
};
类型FunctionMap={[key in Enum]:(…args:any[])=>any};
类型FunctionUnion=ReturnType;
类型函数=函数联合//好的,这里没有问题
一个选项是使用条件类型筛选出非函数类型:
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>;
enum枚举{
Foo=“Foo”
}
常量函数={
[Enum.Foo]:()=>“你好,世界!”,
其他属性:“字符串”
};
类型FunctionMap={[key in Enum]:(…args:any[])=>any};
类型FunctionUnion={
[P in keyof T]:T[P]扩展(…参数:any[])=>any?返回类型:never;
}[keyof T]
类型函数=函数联合;
Ok,对于不理解的人[key in Enum]
只有属于Enum
的授权密钥才是函数。因为FunctionUnion
正在使用T扩展FunctionMap
,这意味着,T
可以有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> = {
[P in keyof T]: T[P] extends (...args: any[]) => any ? ReturnType<T[P]> : never;
}[keyof T]
type functions = FunctionUnion<typeof functions>;