[英]typescript: declare type of map-like object
我正在使用 object 来存储 map,键是字符串,值具有固定类型 T。
在 object 中查找键时,类型推断为其分配类型 T。但它可能未定义。
在以下示例中,我希望 entry 的类型number|undefined
。 但 typescript 推断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 序列化并不能很好地配合。 我宁愿只使用对象。
正如您已经发现的那样,类型推断没有错误,因为data
的类型被明确设置为“在任何字符串键处包含数字的对象”。 所以我们应该让 typescript 知道值可能是undefined
的:
declare const data: { [index: string]: number|undefined };
您还可以使用Record实用程序来定义这样的类型:
declare const data: Record<string, number | undefined>;
Record<K, T>
构造一个具有一组 T 类型的属性 K 的类型。
在玩了一些代码之后,我认为声明类似地图的 object 的正确方法是,其中一些键可能不指向值:
const data: {[index:string]: number|undefined} = {
"aa34da": 1,
"basd23": 2,
"as34sf": 5
}
const entry = data["doesn't exist"];
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.