ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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


O
Ollie

我知道这个问题已经结束,但我发现它正在搜索相同的 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();

编辑,2016 年末

从 TypeScript 1.6 开始,首选的转换运算符是 as,所以这些行可以被压缩成:

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

其他解决方案

当然,如果你想把它做对,这有时是一种矫枉过正,你可以:

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


您还可以创建一个扩展 HTMLElement 并具有附加 getBBox 属性的接口。这样,您仍然可以在其他属性上完成代码。
有什么方法可以正确地转换,而不是转换为 getBBox 吗?想了解 getBBox 的类型?
好的! var coordinates = (<any>outerElement[0]).getBBox();
这实际上并没有回答问题:“如何忽略错误”
as any 技巧适用于我的场景。谢谢你的提示。
B
Bruno Grieder

快速而肮脏的解决方案是显式转换为 any

(y as any).x

“优点”是,强制转换是显式的,即使设置了 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

感谢这有帮助: import http = require('http'); var server = http as any;服务器。服务器(应用程序); //忽略ts错误!
我在“确保在 NodeRequire 上找不到属性”中使用了它。所以我在 NodeRequired 和 (require as any).ensure 上声明了我的 require 变量。希望这可以帮助。
Y
Yaroslav Yakovlev

您还可以使用以下技巧:

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

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

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


有谁知道为什么会这样,以及这是否比最初将对象声明为 :any 有任何潜在的后果或好处?
这将具有保留类型的明显好处,而不是强制转换为任何类型。我想知道为什么这不会引发警告但直接访问会..
严重地 !?!这远远超出了骇人听闻的范围......是的,它可以工作,因为您正在使用字符串查找自定义属性,但请不要。重命名属性不适用于 IDE 重构,并且使用硬编码字符串很容易出错。
C
Charles Marsh

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

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

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

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

declare var y;

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


应为 /// <reference path="/path/to/jquery.d.ts" />,末尾带有自结束标记
我正在使用 VS2015 并遵循 Angular 的 this 教程我的项目中没有 jquery.d.ts 文件
@Dimple npm install -g tsd 然后 tsd install jquery
如果您从 JavaScript 迁移到 TypeScript,并且想要避免错误 TS2304,第二个选项(declare var y)非常有用,因为您的旧 JavaScript 正在引用另一个 JavaScript 文件中的变量。
谢谢!对我来说,问题在于 Jest, const mockPrompt: any = jest.spyOn(step, 'prompt');
B
Benny Neugebauer

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

理论

(<any>y).x;

现实世界的例子

对于此代码,我收到错误“TS2339:“功能”类型上不存在属性“名称””:

let name: string = this.constructor.name;

所以我修复了它:

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

不适用于超级。如果你使用类型扩展一个类,而作者忘记了一个公共方法,那么你就完蛋了。您必须将其添加到类型定义中,该定义会在下一次 npm 安装时停止,迫使您创建拉取请求或以其他方式通知作者,这可能是一件好事,但却是一件痛苦的事情。
L
Lewis

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

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

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

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


是否有一个 tsconfig compilerOptions 标志来完全禁用它?
z
zapping

在 Angular2 中遇到问题,我正在使用本地存储来保存一些东西,但它不会让我这样做。

解决方案:

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

如何修复它:

localStorage['city'] (localStorage).city (localStorage as any).city


第二个选项看起来很酷,但似乎不再起作用了。如果您使用 <any> - (<any>localStorage).city 作为对象的前缀,则可以使用。
我知道这已经过时了,但是您的最佳示例对我有用。做得好。
d
danday74

一个没有其他方法的快速修复:

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


我也这样做,但某些平台(如 Google Cloud)会发出警告消息,提示 ab 优于 a['b']。你知道这是为什么吗?
不确定,但您可以,例如在 tslint.json 中,更改选项以使其更喜欢 ab
R
Randy

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


c
cs_pupil

我能够使用类似的东西在打字稿中克服这个问题:

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 的键并进行编译的唯一方法。