忽略Typescript Errors "属性在type&quot的值上不存在;

在VS2013中,当tsc使用代码1退出时,构建停止。但在VS2012中却不是这样。

如何在忽略tsc.exe错误的情况下运行我的解决方案?

我得到许多The property 'x' does not exist on value of type 'y'错误,我想在使用javascript函数时忽略这些错误。

424091 次浏览

有几种方法可以处理这个问题。如果该对象与某个外部库相关,最好的解决方案是找到该库的实际定义文件(great repository 在这里)并引用它,例如:

/// <reference path="/path/to/jquery.d.ts" >

当然,这在很多情况下并不适用。

如果你想“覆盖”类型系统,试试下面的方法:

declare var y;

这将允许你对var y进行任何调用。

我知道问题已经关闭,但我发现它正在搜索相同的TypeScriptException,也许其他人正在搜索这个问题。
问题在于缺少TypeScript类型:

var coordinates = outerElement[0].getBBox();

抛出The property 'getBBox' does not exist on value of type 'HTMLElement'.


最简单的方法是显式地将变量类型为' any '
var outerHtmlElement: any = outerElement[0];
var coordinates = outerHtmlElement.getBBox();

编辑,2016年底

从TypeScript 1.6开始,首选的强制转换操作符是as,所以这些行可以压缩成:

let coordinates = (outerElement[0] as any).getBBox();


其他的解决方案

当然,如果你想把它做对,这有时是过度的,你可以:

  1. 创建自己的接口,简单地扩展HTMLElement
  2. 引入自己的类型,扩展HTMLElement

你也可以使用下面的技巧:

y.x = "some custom property"//gives typescript error

y["x"] = "some custom property"//no errors

注意,要访问x并且不再得到typescript错误,你需要像y["x"]那样编写它,而不是y.x。所以从这个角度来看,其他选择更好。

在我的特定项目中,我无法让它工作,并使用declare var $;这不是一个干净/推荐的解决方案,它不识别JQuery变量,但我使用后没有错误(并且必须为我的自动构建成功)。

快速而简单的解决方案是显式强制转换为any

(y as any).x

“advantage"是,强制转换是显式的,即使设置了noImplicitAny标志,它也会编译。

正确的解决方案是更新类型定义文件。

请注意,当你将一个变量强制转换为any时,你会检查该变量的类型。


由于我处于免责模式,通过any结合新接口的双重强制转换在以下情况下是有用的

  • 您不希望更新损坏的类型文件
  • 而且/或者你是猴子补丁

然而,您仍然需要某种形式的输入。

假设你想用一个类型为number的新属性x修补类型为OrginalDefy实例的定义:

const y: OriginalDef = ...


interface DefWithNewProperties extends OriginalDef {
x: number
}


const patched = y as any as DefWithNewProperties


patched.x = ....   //will compile

在Angular2中有一个问题,我正在使用本地存储来保存一些东西,它不允许我这样做。

解决方案:

我有localStorage.city -> error -> Property 'city' does not exist on type 'Storage'.

如何解决:

localStorage(城市的)

(localStorage) .city

(localStorage as any).city

当TypeScript认为“x”属性在“y”上不存在时,那么你总是可以将“y”转换为“any”,这将允许你在“y”上调用任何东西(比如“x”)。

理论

(<any>y).x;

现实世界中的例子

我得到了这个代码的错误“TS2339:属性“名称”在类型“函数”上不存在”:

let name: string = this.constructor.name;

所以我用:

let name: string = (<any>this).constructor.name;

我能够在typescript中使用类似的东西来解决这个问题:

let x = [ //data inside array ];
let y = new Map<any, any>();
for (var i=0; i<x.length; i++) {
y.set(x[i], //value for this key here);
}

这似乎是我可以使用X中的值作为映射Y的键并进行编译的唯一方法。

其他方法都不管用的快速解决方法:

const a.b = 5 // error


const a['b'] = 5 // error if ts-lint rule no-string-literal is enabled


const B = 'b'
const a[B] = 5 // always works

这不是一个好的实践,但提供了一个解决方案,而不需要关闭no-string-literal

我知道现在已经是2020年了,但我找不到一个能满足这个问题“忽略”部分的答案。事实证明,你可以用一个指令告诉TSLint这样做;

// @ts-ignore
this.x = this.x.filter(x => x.someProp !== false);

通常这会抛出一个错误,指出“someProp在类型上不存在”。有了注释,错误就消失了。

这将阻止编译时抛出任何错误,也应该停止IDE对您的抱怨。