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 编译器现在抱怨将 null
或 undefined
传递给重载的函数/方法。
例如,谷歌地图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】:您现在解决它的方式有效,但比必要的更冗长。
你可以指定你的意思 null
是 google.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 传递给重载函数?的主要内容,如果未能解决你的问题,请参考以下文章