TypeScript定义ReadonlyMap<K, V>
接口(interface),它是标准JavaScript Map<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>
的父类(super class)型,因为它的方法和属性确实与Map<K,V>
匹配。因此,通过返回Map
作为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()
示例,调用者无法知道返回值始终是string
,并且不能直接在其上调用任何特定于字符串的方法。)这种对运行时行为的编译时禁止类似于
readonly
modifier的工作方式。当属性为readonly
时,即使您在运行时修改成功,如果尝试修改它,TypeScript也会抱怨。您可以根据需要实现自己的
ReadonlyMap
版本,即使在运行时该版本也是只读的,但是只有在有需要的用例的情况下,才值得这样做。如果您不这样做,那么(也可能不这样做)就不必担心它,并继续按照自己的方式去做。希望能有所帮助;祝好运!
关于javascript - 使用ReadonlyMap <K,V>类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50046573/