3

今天将 TypeScript 从 0.8.0.0 更新到 0.8.1.1。TS 编译器现在抱怨传递null或传递undefined给重载的函数/方法。

例如,谷歌地图Marker类有一个setMap有 2 个重载的方法。这是从绝对类型项目中的谷歌地图定义文件中获取的

declare module google.maps {
    ...
    export class Marker extends MVCObject {
        ...
        setMap(map: Map): void;
        setMap(map: StreetViewPanorama): void;
        ...
    }
    ...
}

根据 google maps API v3 docs,要从地图中删除标记,您应该将其地图设置为 null。我以前在 TS 0.8.0.0 中使用过这个,它运行良好:

var someMarker: google.maps.Marker = (code to initialize marker);
...
someMarker.setMap(null);

TypeScript 0.8.1.1 通过以下消息抱怨这一点:

不明确的调用表达式 - 无法选择重载。

我尝试过的一个无效的修复方法是试图强迫 TS 相信null是对google.maps.Map. 这显然是不正确的语法,因为编译器抱怨它需要一个;where the )is。

someMarker.setMap(null: google.maps.Map);

这是我现在拥有的修复程序,它似乎有效。这是解决此问题的正确方法吗?

var nullMap: google.maps.Map = null;
someMarker.setMap(nullMap);

我意识到另一个解决方法可能是修改 google maps TS 定义文件以允许重载setMap(map: any): void;,但这似乎是一个糟糕的解决方案。目前是否有任何其他方式或计划在未来的 TS 版本中解决此问题?

4

2 回答 2

5

您解决它的方式现在有效,但比必要的更冗长。

null您可以通过将其转换为该类型来指定您的意思google.maps.Map

someMarker.setMap(<google.maps.Map>null);
于 2013-01-08T19:43:06.080 回答
0

我试过

someMarker.setMap(<google.maps.Map>null);

正如建议的那样,但它没有用。我得到了这个编译错误:Type 'null' cannot be converted to type 'Map'.

这是对我有用的方式:

interface GenericMapShimType {
  setMap(map: google.maps.Map | null): void;
}
(someMarker as SetMapShimType).setMap(null);
于 2018-01-03T00:49:22.803 回答