我有一个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编译器来编译同一个文件时,它不会发出任何错误或警告。
答案 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中的演示: