忽略Typescript错误"属性在类型的值上不存在"

dan*_*iel 193 javascript typescript visual-studio-2013

在VS2013中,当tsc以代码1退出时,构建停止.在VS2012中不是这种情况.

如何在忽略tsc.exe错误的同时运行我的解决方案?

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

mic*_*ukm 252

我知道这个问题已经关闭,但我发现它搜索的是同一个TypeScriptException,也许还有其他人在搜索这个问题时遇到了这个问题.

问题在于缺少TypeScript类型:

var coordinates = outerElement[0].getBBox();
Run Code Online (Sandbox Code Playgroud)

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


最简单的方法是显式输入变量 any

var outerHtmlElement: any = outerElement[0];
var coordinates = outerHtmlElement.getBBox();
Run Code Online (Sandbox Code Playgroud)

编辑,2016年末

由于TypeScript 1.6首选的投射操作符是as那些线条可以被摆成优雅:

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


其他方案

当然,如果你想做得对,有时候有点矫枉过正,你可以:

  1. 创建自己的界面,只需扩展 HTMLElement
  2. 介绍自己的打字扩展 HTMLElement

  • 您还可以创建一个扩展`HTMLElement`的接口,并具有额外的`getBBox`属性.这样你仍然可以在其他属性上获得代码完成. (11认同)
  • 太好了!`var coordinates =(<any> outerElement [0]).getBBox();` (4认同)
  • 这实际上并没有回答这个问题:“如何忽略错误” (2认同)

Bru*_*der 105

快速而肮脏的解决方案是明确地转换为 any

(y as any).x
Run Code Online (Sandbox Code Playgroud)

"优点"是,演员表是显式的,即使noImplicitAny设置了标志也会编译.

正确的解决方案是更新打字定义文件.

请注意,当您将变量强制转换为时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
Run Code Online (Sandbox Code Playgroud)


Yar*_*lev 56

您还可以使用以下技巧:

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

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

注意,要访问x并且再次没有得到打字稿错误,您需要像这样写y["x"],而不是y.x.所以从这个角度来看,其他选择更好.

  • 有谁知道为什么这有效,如果这最初将对象声明为`:any`有任何潜在的后果或好处? (4认同)
  • @gotjosh 请建议替代方案。 (2认同)

Cha*_*rsh 37

有几种方法可以解决这个问题.如果此对象与某个外部库相关,那么最好的解决方案是找到该库的实际定义文件(此处为大型存储库)并引用它,例如:

/// <reference path="/path/to/jquery.d.ts" >
Run Code Online (Sandbox Code Playgroud)

当然,这在许多情况下不适用.

如果要"覆盖"类型系统,请尝试以下操作:

declare var y;
Run Code Online (Sandbox Code Playgroud)

这样您就可以拨打任何电话var y.

  • 应该是`/// <reference path ="/ path/to/jquery.d.ts"/>`最后用自闭标签 (5认同)

Ben*_*uer 16

当打字稿认为,财产的"x"不上不存在"Y",那么你可以随时施放"Y"为"任何",这将允许您调用任何东西(如"x")上的"Y".

理论

(<any>y).x;
Run Code Online (Sandbox Code Playgroud)

真实世界的例子

对于此代码,我收到错误"TS2339:属性'名称'在类型'函数'上不存在":

let name: string = this.constructor.name;
Run Code Online (Sandbox Code Playgroud)

所以我修复了:

let name: string = (<any>this).constructor.name;
Run Code Online (Sandbox Code Playgroud)

  • 不适用于超级。如果您使用类型扩展一个类,而作者忘记了一个公共方法,那么您就大错特错了。您必须将其添加到类型定义中,该类型定义在下一次 npm 安装时停止,迫使您创建拉取请求或以其他方式通知作者,这可能是一件好事但很痛苦。 (2认同)

Avr*_*gil 14

在Angular2中遇到问题,我使用本地存储来保存一些东西,它不会让我.

解决方案:

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

如何解决:

localStorage的[ '城市']

(localStorage的).市

(localStorage as any).city


Lew*_*wis 13

我知道现在是 2020 年,但我看不到满足问题“忽略”部分的答案。事实证明,您可以使用指令告诉 TSLint 这样做;

// @ts-ignore
this.x = this.x.filter(x => x.someProp !== false);
Run Code Online (Sandbox Code Playgroud)

通常这会抛出一个错误,指出'someProp 在类型上不存在'。随着评论,该错误消失了。

这将停止编译时抛出的任何错误,并且还应该停止您的 IDE 向您抱怨。


dan*_*y74 6

一个没有其他作用的快速修复:

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
Run Code Online (Sandbox Code Playgroud)

不是很好的做法,但提供了一种无需关闭无字符串文字的解决方案