首页 > 解决方案 > 打字稿:使用正则表达式作为类型键

问题描述

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

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

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

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

两者{ latitude: 23.5, longitude: 34.5 }都是{ LATITUDE: 23.5, LongITUDe: 34.5 }type HasPosition

这是可行的吗?它似乎可能与有关(因为我实际上是在尝试验证作为数据点键的字符串)。我已经尝试了很多最终成为无意义语法的东西(包括上面的代码),所以我也对其他类型的解决方案持开放态度。

标签: typescript

解决方案


你说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


推荐阅读