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/

10-10 07:38