代码之家  ›  专栏  ›  技术社区  ›  Stav Alfi

Typescript-如何将联合字符串作为枚举发送?

  •  0
  • Stav Alfi  · 技术社区  · 4 年前

    以下代码未编译( https://www.typescriptlang.org/play ):

    // I can't change it to be Enum2
    enum Enum1 {
      A = 'a',
      B = 'b',
    }
    
    // auto generated by third library tool - can't change it
    enum Enum2 {
      A = 'a',
      B = 'b',
    }
    
    // auto generated by third library tool - can't change it
    type Union = 'a' | 'b'
    
    declare function f1(e: Enum1): void
    
    // Argument of type 'Enum2.A' is not assignable to parameter of type 'Enum1'.(2345)
    f1(Enum2.A) // does not compile
    f1('a') // does not compile
    

    错误:

    TS2345:“HardhatPodStartedDto[]”类型的参数不可分配给“SetStateAction<HardhatPodStarted[]>'

    我能做些什么来解决编译错误?

    • 我无法更改Enum1、Enum2和Union。
    1 回复  |  直到 4 年前
        1
  •  2
  •   T.J. Crowder    4 年前

    你唯一没有说你不能改变的是函数,所以:

    declare function f1(e: Union): void
    //                     ^^^^^
    

    然后,您的两个示例都起作用: playground

    如果 的实施 f1 需要从转换 Union Enum1 Enum2 ,真的没有捷径可走。不过,你可以很容易地创建一个函数:

    const unionToEnum1 = (u: Union): Enum1 => {
        switch (u) {
            case "a":
                return Enum1.A;
            case "b":
                return Enum1.B;
            default:
                throw new Error(`Unexpected 'Union' value "${u}"`);
        }
    };
    

    和/或类似 Enum2

    和/或用于以下情况的编译时转换:

    type UnionToEnum1<U extends Union> =
          U extends "a" ? Enum1.A
        : U extends "b" ? Enum1.B
        : never;
    
    推荐文章