忽略typescript错误“类型的值上不存在属性”

IT技术 javascript typescript visual-studio-2013
2021-01-23 04:57:37

在 VS2013 中,当 tsc 以代码 1 退出时,构建会停止。在 VS2012 中情况并非如此。

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

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

6个回答

我知道这个问题已经结束,但我发现它在搜索相同的 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
您还可以创建一个扩展HTMLElement并具有附加getBBox属性的接口这样你仍然可以在其他属性上完成代码。
2021-03-15 04:57:37
这实际上并没有回答这个问题:“如何忽略错误”
2021-03-17 04:57:37
好的! var coordinates = (<any>outerElement[0]).getBBox();
2021-03-28 04:57:37
getBBox有没有任何方法可以正确地投射,而不是投射到 any 中喜欢找出getBBox什么类型
2021-03-29 04:57:37
这个as any技巧适用于我的场景。谢谢你的提示。
2021-04-05 04:57:37

快速而肮脏的解决方案是明确地强制转换为 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
谢谢这有帮助: import http = require('http'); var server = http as any; 服务器。服务器(应用程序);//忽略ts错误!
2021-04-09 04:57:37
我在“确保在 NodeRequire 上找不到属性”中使用了它。所以我在 NodeRequired 和 (require as any) 上声明了我的 require 变量。确保属性。希望这可以帮助。
2021-04-09 04:57:37

您还可以使用以下技巧:

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

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

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

保留类型而不是强制转换为任何类型具有明显的好处。我想知道为什么这不会发出警告,但直接访问会..
2021-03-24 04:57:37
有谁知道为什么会这样,如果这比最初将对象声明为 有任何潜在的后果或好处:any
2021-04-05 04:57:37

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

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

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

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

declare var y;

这将使您可以拨打任何您想要的电话var y

@Dimplenpm install -g tsd那么tsd install jquery
2021-03-14 04:57:37
如果您从 JavaScript 迁移到 TypeScript,并且想要避免 TS2304 错误,因为您的旧 JavaScript 正在引用另一个 JavaScript 文件中的变量,则第二个选项(声明 var y)效果很好。
2021-04-04 04:57:37
我正在使用 VS2015 并按照教程进行 angularjquery.d.ts我的项目中没有文件
2021-04-06 04:57:37
谢谢!对我来说,问题在于 Jest, const mockPrompt: any = jest.spyOn(step, 'prompt');
2021-04-11 04:57:37
最后应该/// <reference path="/path/to/jquery.d.ts" />带有自结束标记
2021-04-13 04:57:37

当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;
不适用于超级。如果您使用类型扩展一个类,而作者忘记了一个公共方法,那么您就大错特错了。您必须将它添加到类型定义中,它会在下一次 npm 安装时停止,迫使您创建拉取请求或以其他方式通知作者,这可能是一件好事但很痛苦。
2021-03-26 04:57:37