代码之家  ›  专栏  ›  技术社区  ›  Joshua

字符串枚举作为映射键不适用于ReturnType

  •  0
  • Joshua  · 技术社区  · 7 年前

    我正在尝试为 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)

    为什么会抛出错误?

    0 回复  |  直到 7 年前
        1
  •  2
  •   Titian Cernicova-Dragomir    7 年前

    枚举出现错误,因为索引签名 [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>; 
    
    推荐文章