首页 > 解决方案 > 如何从 TypeScript / JavaScript String Literal Types 中针对单个位求和选择特定值?

问题描述

如何从 TypeScript / JavaScript String Literal Types 中针对单个位求和选择特定值?作为助手,可以使用按位键的文字类型映射:1、2、4、8,...我不确定如何将结果/返回值放在一起,以便返回与给定类型兼容的结果.

变体 1:

  const result: "Aaa" | "Bbb" | "Ccc" | "Ddd" = selectByBitwiseSum1(5);

  // THE EXPECTED RESULT:
  result = "Aaa" | "Ccc";


  export function selectByBitwiseSum1(bitwiseSum: number): "Aaa" | "Bbb" | "Ccc" | "Ddd" {

    var result;

    var optMap = [ {key: 1, val: "Aaa"},
                   {key: 2, val: "Bbb"},
                   {key: 4, val: "Ccc"},
                   {key: 8, val: "Ddd"}  ];

    // THE DESIRED CONVERSION PLEASE  TO RETURN GIVEN TYPE (NOT STRING ARRAY)
    result = ???

                  // THE EXPECTED RESULT:
    //result = "Aaa" | "Ccc";

    return result;
    
  }

变体 2 - 数组类型:

  const result: ("Aaa" | "Bbb" | "Ccc" | "Ddd")[] = selectByBitwiseSum2(5);

  result = ("Aaa" | "Ccc")[];


  export function selectByBitwiseSum2(bitwiseSum: number): ("Aaa" | "Bbb" | "Ccc" | "Ddd")[] {

    var result;

    var optMap = [ {key: 1, val: "Aaa"},
                   {key: 2, val: "Bbb"},
                   {key: 4, val: "Ccc"},
                   {key: 8, val: "Ddd"}  ];


    // THE DESIRED CONVERSION PLEASE  TO RETURN GIVEN TYPE (NOT STRING ARRAY)
    result = ???
                  // THE EXPECTED RESULT:
    //result = ("Aaa" | "Ccc")[];

    return result;
    
  }

标签: javascripttypescript

解决方案


你可以用这个单线做所有的事情

const arr="AAA,BBB,CCC,DDD,EEE,FFF".split(",");
console.log((5).toString(2).split("").reverse()
 .reduce((a,c,i)=>(!+c||a.push(arr[i]),a),[]).join(" | "))

!+c||a.push(are[i],a可能值得稍微解释一下:c是数字的二进制表示的单个数字(“0”或“1”)5,从“最低有效位”开始(因为我.reverse()是数组)。前面+的 将字符串转换为整数,否定运算符!将其转换为trueor false||仅当第一个表达式为 时,才会执行以下运算符之后的部分false


推荐阅读