TypeScript强制转换(断言)会导致语法错误编译器警告?

时间:2014-06-20 20:21:30

标签: visual-studio visual-studio-2013 typescript

我有一个TypeScript脚本,必须与使用全局函数作为回调的第三方供应商进行交互(您无法通过回调)。例如,去"听"对于来自" API"的结果,您可以定义函数SetElqContent。例如,

window.SetElqContent = function(){/* handle result */};

当TypeScript编译器看到此行时,它会抱怨The property 'SetElqContent' does not exist on value of type 'Window'

我以为我可以通过简单地输入"任何"来解决这个问题。实际上,这不是类型转换而是type assertion,但我认为它是投射,虽然我理解它是not quite the same。所以,我试过了:

(<any>window).SetElqContent = function(){/* handle result */};;

令人惊讶的是,这会产生Syntax error,并且行号和列指向<演员阵容中的<any>字符。我尝试了其他一些变体,无论我在做什么样的演员表,我都会在演员的最初Syntax error得到<

var windowAny = <any>window;
var docElement = <HTMLElement>window.document;

我的类型断言是什么,它是无效的语法?

我使用Visual Studio 2013和Update 2,它有一个&#34;编译保存&#34; TypeScript文件的功能。这就是我编译我的.ts文件的方式,它是在Visual Studio中发出Syntax error消息的。

更新:显然这与Visual Studio有关。当我使用独立的tsc编译器来编译同一个文件时,它不会发出任何错误或警告。

4 个答案:

答案 0 :(得分:2)

显然我的语法是正确的,但Visual Studio工具中有一个错误。我无法提供准确的重现步骤,事实上,删除.ts文件中的所有内容,保存,然后恢复代码(通过ctrl-z)和重新保存导致“语法错误”警告消失。

如果我可以确定有关导致此问题的原因的更多细节,我会报告回来。

答案 1 :(得分:1)

最好的方法是为它创建一个类型定义文件 如果库名是eloqua.js,则创建一个eloqua.d.ts文件并在.js文件中引用它,如

  

///&lt;参考路径=&#34; ../ typings / eloqua.d.ts&#34; /&GT;

在YetTyped网站上有许多在线类型定义文件。 https://github.com/borisyankov/DefinitelyTyped

你也可以在那里捐款。

答案 2 :(得分:1)

如果扩展Window接口定义,则会删除错误:

interface Window {
    SetElqContent: Function;
}

window.SetElqContent = function(){/* handle result */};

答案 3 :(得分:1)

以下是正确执行断言的方法:

function SetElqContent(){/* handle result */};

// FINE
(<any>window).SetElqContent = SetElqContent;

// FINE
(<any>window).SetElqContent = function SetElqContent(){/* handle result */};

<强>更新 VS中的演示: enter image description here

相关问题