javascript - 使用 ReadonlyMap类型
问题描述
TypeScript 定义ReadonlyMap<K, V>
了标准 JavaScriptMap<K, V>
类型的不可变版本的接口。
我们应该如何ReadonlyMap<K, V>
在我们的代码中使用?
它不是从任何东西派生的,也没有声明构造函数。那么,我们是否应该这样做:
public publicApiMethod(): ReadonlyMap<K, V> {
const map: Map<K, V> = new Map(...);
return map as ReadonlyMap<K, V>;
}
还是有更好的方法来使用ReadonlyMap<K, V>
而不仅仅是类型转换?
解决方案
简短的回答:你做对了。
ReadonlyMap<K, V>
本质上是 的超类型,Map<K, V>
因为它确实具有与 . 匹配的方法和属性Map<K,V>
。因此,通过将 aMap
作为 a返回ReadonlyMap
,您所做的就是扩大值的类型。顺便说一句,这意味着您可以跳过类型断言:
public publicApiMethod(): ReadonlyMap<K, V> {
const map: Map<K, V> = new Map(...);
return map; // no assertion necessary
}
就像你可以这样做:
public anotherMethod(): string | number {
return "hey"; // always "hey", but assignable to string | number
}
好处是调用者不能随意假设返回的值具有任何其他Map
方法,并且尝试设置或清除映射内容将产生编译时错误,尽管这些方法确实存在于运行时。(或者anotherMethod()
例如,调用者不知道返回值始终是 astring
并且不能直接在其上调用任何特定于字符串的方法。)
这种运行时行为的编译时禁止类似于readonly
修饰符的工作方式。当属性为readonly
时,如果您尝试修改它,TypeScript 会报错,即使修改会在运行时成功。
如果您愿意,您可以实现自己的ReadonlyMap
只读版本,即使在运行时也是如此,但只有当您有一个需要它的用例时,才值得付出努力。如果你不这样做,(而且你可能不这样做)那么不要担心它并继续按照你的方式去做。
希望有帮助;祝你好运!
推荐阅读
- python - 有没有办法在 python3 jupyter 笔记本中取消嵌套熊猫数据框?
- javascript - Google AdSense 测试代码未在我的实时网站上显示测试广告
- javascript - 如何在打字稿中创建模板字符串?
- python - 将文件加载到 Informix 数据库时从 Pandas DataFrame.to_sql 获取错误
- assembly - 如何在不中断代码的情况下从键盘获取输入?即检查键盘状态
- r - 根据R中的每个组计算后续行的日期差异
- vba - 如何将现有参数从报表传递到查询
- linux - 我如何知道要安装哪个 Ubuntu 软件包?
- python - 尝试使用 pip 安装 rpy2 时出错
- go - Golang echo 包中间件实现