忽略打字稿错误“类型的值不存在属性”

2020/10/11 20:41 · javascript ·  · 0评论

在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'.


最简单的方法是将变量显式地键入为“ any”

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

### Edit,2016年末由于TypeScript 1.6首选的转换运算符是as可以将这些行压缩为:

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


###其他解决方案当然,如果您想做对的话(有时会过分夸大),则可以:

  1. 创建简单的扩展接口 HTMLElement
  2. 介绍扩展自己的类型 HTMLElement

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

(y as any).x

“优势”在于,强制类型转换是显式的,即使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

您还可以使用以下技巧:

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

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

请注意,要再次访问x并没有遇到打字错误,您需要这样写y["x"],而不是y.x因此,从这个角度来看,其他选择更好。

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

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

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

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

declare var y;

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

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

理论

(<any>y).x;

真实的例子

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

let name: string = this.constructor.name;

所以我用:

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

Angular2出现问题,我正在使用本地存储来保存某些内容,但它不允许我这样做。

解决方案:

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

解决方法:

localStorage ['city']

(localStorage).city

(localStorage任意).city

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

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

通常,这会引发错误,指出“ type上不存在someProp”。有了注释,该错误就消失了。

这将阻止编译时引发的任何错误,并且还应避免IDE向您抱怨。

快速解决其他问题的方法:

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

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

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

我能够使用类似这样的文字来解决这个问题:

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

本文地址:http://javascript.askforanswer.com/huluedazigaocuowuleixingdezhibucunzaishuxing.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!