Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 字符串枚举作为映射键不适用于ReturnType_Typescript - Fatal编程技术网

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>;