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

在typescript中映射标记的union类型的所有标记

  •  1
  • Robin  · 技术社区  · 6 年前

    是否可以将标记的联合类型的所有标记映射到数组中?假设我们有以下类型:

    type Options = Cash | PayPal | CreditCard;    
    
    interface Cash {
      kind: "cash";
    }
    
    interface PayPal {
      kind: "paypal";
      email: string;
    }
    
    interface CreditCard {
      kind: "credit";
      cardNumber: string;
      securityCode: string;
    }
    

    可以收集所有的鉴别器吗 kind 进入字符串数组?结果应该是 ['cash', 'paypal', 'credit'] .

    提前谢谢!

    1 回复  |  直到 6 年前
        1
  •  1
  •   Titian Cernicova-Dragomir    6 年前

    无法从标准类型脚本中的类型中获取值(可能有一些非官方的语言扩展允许这样做)

    你可以得到一个类型,它是一个联合体 kind S:

    type OptionsKind = Options['kind'] //  "cash" | "paypal" | "credit"
    

    您还可以构建一个对象,该对象必须具有联合的所有属性并使用 Object.keys 要从此对象获取数组,请执行以下操作:

    type OptionsKind = Options['kind'] //  "cash" | "paypal" | "credit"
    let OptionsKind: { [P in OptionsKind]: 1 } = {
        cash: 1,
        credit: 1,
        paypal: 1        
    }
    let OptionsKindArray = Object.keys(OptionsKind);
    

    如果对象中有任何额外的键,如果对象中没有所有的键,如果拼写错误,此解决方案将确保出现错误。所以基本上它确保了重复的数据至少总是最新的。

    您甚至可以为任何联合创建一个助手函数:

    type OptionKinds = Options['kind'] //  "cash" | "paypal" | "credit"
    function unionValues<T extends string>(o: Record<T, 1>) {
        return Object.keys(o) as T[];
    }
    
    let OptionKinds = unionValues<OptionKinds>({ cash: 1, paypal: 1, credit: 1 });