【问题标题】:typescript: declare type of map-like objecttypescript:声明类地图对象的类型
【发布时间】:2020-04-16 14:44:47
【问题描述】:

我使用对象来存储地图,键是字符串,值是固定类型 T。

当在对象中查找键时,类型推断会为其分配类型 T。 但它可能是未定义的。
在以下示例中,我希望条目的类型为 number|undefined。但是打字稿推断出类型number。这似乎不正确:

const data: {[index:string]: number} = {
    "aa34da": 1,
    "basd23": 2,
    "as34sf": 5
};

const entry = data["doesn't exist"];
console.log(entry);

这是类型推断中的错误吗?

我知道 ES6 Map,它提供了一个 get() 方法,正是我所期望的签名。但是 Map 不能很好地与 JSON 序列化配合使用。我宁愿只使用对象。

【问题讨论】:

    标签: javascript typescript serialization


    【解决方案1】:

    正如您已经发现的那样,类型推断没有错误,因为data 的类型被明确设置为“在任何字符串键处包含数字的对象”。所以我们应该让 typescript 知道这个值可能是undefined:

    declare const data: { [index: string]: number|undefined };
    

    您也可以使用Record 实用程序来定义这样的类型:

    declare const data: Record<string, number | undefined>;
    

    Record&lt;K, T&gt; 构造一个具有一组 T 类型的属性 K 的类型。

    【讨论】:

      【解决方案2】:

      在玩了一些代码之后,我认为声明一个类似地图的对象的正确方法是:其中一些键可能不指向值:

      const data: {[index:string]: number|undefined} = {
          "aa34da": 1,
          "basd23": 2,
          "as34sf": 5
      }
      
      const entry = data["doesn't exist"];
      

      【讨论】:

      • 或使用记录工具:Record&lt;string, number | undefined&gt;
      • 哦,这很整洁。如果您将评论转换为答案,我会接受。
      猜你喜欢
      • 1970-01-01
      • 2013-10-12
      • 2016-01-13
      • 2023-03-20
      • 2021-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多