在 VS2013 中,当 tsc 以代码 1 退出时,构建会停止。在 VS2012 中情况并非如此。
如何在忽略 tsc.exe 错误的同时运行我的解决方案?
我收到很多The property 'x' does not exist on value of type 'y'
错误,在使用 javascript 函数时我想忽略这些错误。
在 VS2013 中,当 tsc 以代码 1 退出时,构建会停止。在 VS2012 中情况并非如此。
如何在忽略 tsc.exe 错误的同时运行我的解决方案?
我收到很多The property 'x' does not exist on value of type 'y'
错误,在使用 javascript 函数时我想忽略这些错误。
我知道这个问题已经结束,但我发现它在搜索相同的 TypeScriptException,也许其他人在搜索这个问题时遇到了这个问题。
问题在于缺少 TypeScript 类型:
var coordinates = outerElement[0].getBBox();
投掷 The property 'getBBox' does not exist on value of type 'HTMLElement'.
var outerHtmlElement: any = outerElement[0];
var coordinates = outerHtmlElement.getBBox();
从 TypeScript 1.6 开始,首选的转换运算符是as
,因此可以将这些行压缩为:
let coordinates = (outerElement[0] as any).getBBox();
当然,如果你想把它做对,这有时有点矫枉过正,你可以:
HTMLElement
HTMLElement
快速而肮脏的解决方案是明确地强制转换为 any
(y as any).x
“优点”是,强制转换是显式的,即使noImplicitAny
设置了标志,它也会编译。
正确的解决方案是更新typings 定义文件。
请注意,当您将变量强制转换为 时any
,您选择不对该变量进行类型检查。
由于我处于免责声明模式,通过any
结合新界面进行双重转换,在以下情况下很有用
然而,您仍然需要某种形式的打字。
说要修补的一个实例的定义y
类型的OrginalDef
一个新的属性x
类型number
:
const y: OriginalDef = ...
interface DefWithNewProperties extends OriginalDef {
x: number
}
const patched = y as any as DefWithNewProperties
patched.x = .... //will compile
您还可以使用以下技巧:
y.x = "some custom property"//gives typescript error
y["x"] = "some custom property"//no errors
请注意,要访问x
并且不再出现typescript错误,您需要像这样编写它y["x"]
,而不是y.x
. 所以从这个角度来看,其他选择更好。
有几种方法可以处理这个问题。如果此对象与某个外部库相关,最好的解决方案是找到该库的实际定义文件(这里是一个很好的存储库)并引用它,例如:
/// <reference path="/path/to/jquery.d.ts" >
当然,这在很多情况下并不适用。
如果要“覆盖”类型系统,请尝试以下操作:
declare var y;
这将使您可以拨打任何您想要的电话var y
。
当typescript认为,财产的“X”上不存在“Y”,那么你可以随时施放“Y”为“任何”,这将允许您调用任何东西(如“x”)上的“Y”。
理论
(<any>y).x;
真实世界示例
对于此代码,我收到错误“TS2339:类型 'Function' 上不存在属性 'name'”:
let name: string = this.constructor.name;
所以我修复了它:
let name: string = (<any>this).constructor.name;