打字稿:使用 RegExp 作为类型键

时间:2021-07-06 03:30:46

标签: typescript

是否可以使用正则表达式作为关键属性?

这里的用例是我获取的数据必须包含位置信息(纬度和经度),但我不关心大小写。

理想情况下,我可以声明如下:

interface HasPosition {
   [lat: /latitude/i]: number;
   [lng: /longitude/i]: number;
}

{ latitude: 23.5, longitude: 34.5 }{ LATITUDE: 23.5, LongITUDe: 34.5 } 都是 HasPosition 类型。

这可行吗?它似乎可能与 this 相关(因为我本质上是在尝试验证作为数据点键的字符串)。我尝试了很多最终都是无意义的语法(包括上面的代码),所以我也愿意接受其他类型的解决方案。

1 个答案:

答案 0 :(得分:0)

您说的是 I'm open to other types of solutions,所以我认为一种方法是使用自定义映射器将对象转换为 HasPosition 接口。

像这样:

class Utils {
    static MapToPosition(obj: object) : HasPosition 
    {
      var position :HasPosition =  {lat:0, lng:0};
      (Object.keys(obj) as Array<keyof typeof obj>).forEach(t=>{
           if((t as string).toLowerCase().includes("latitude"))
               position["lat"] = obj[t];
            else if((t as string).toLowerCase().includes("longitude"))
               position["lng"]= obj[t];
      })
     return position;
    }
}

var pos1 = Utils.MapToPosition({ latitude: 23.5, longitude: 34.5 });
var pos2 = Utils.MapToPosition({ LATITUDE: 23.5, LongITUDe: 34.5 });

PlaygroundLink