TypeScript:如何在 0.8.0.0 之后的版本中将 null 传递给重载函数?

Posted

技术标签:

【中文标题】TypeScript:如何在 0.8.0.0 之后的版本中将 null 传递给重载函数?【英文标题】:TypeScript: How to pass null to an overloaded function in versions after 0.8.0.0? 【发布时间】:2012-12-22 18:14:21 【问题描述】:

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

例如,谷歌地图Marker 类有一个setMap 方法和2 个重载。这取自google maps definition file in the Definitely Typed project:

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

According to the google maps API v3 docs,要从地图中删除标记,您应该将其地图设置为空。我之前在 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 的引用。这显然是不正确的语法,因为编译器抱怨它期望 ;) 所在的位置。

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

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

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

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

【问题讨论】:

这是一个错误 - typescript.codeplex.com/workitem/587。我相信它将在 0.8.2.0 或 0.8.3.0 中修复。下面彼得奥尔森的建议是最好的解决方法。 【参考方案1】:

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

你可以指定你的意思 nullgoogle.maps.Map 类型,方法是这样转换。

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

【讨论】:

感谢转换语法,我不知道这一点。 截至目前,assertions 类型的 preferred 语法(毕竟,从技术上讲,我们并没有在这里 casting 任何东西)是 null as google.maps.Map .【参考方案2】:

我试过了

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);

【讨论】:

以上是关于TypeScript:如何在 0.8.0.0 之后的版本中将 null 传递给重载函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何更新 NSMutableDictionary 中的 NSMutableArray 值

为啥这个意想不到的作曲家版本结果?

Bucketize 实值张量

在typescript项目中引入如何js依赖

TensorFlow 中类似 NumPy 的切片

如何覆盖这个 ESLint TypeScript 规则?