在 VS2013 中,当 tsc 以代码 1 退出时,构建停止。在 VS2012 中情况并非如此。
如何在忽略 tsc.exe 错误的情况下运行我的解决方案?
我遇到了很多The property 'x' does not exist on value of type 'y'
错误,我想在使用 javascript 函数时忽略这些错误。
在 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'.
var outerHtmlElement: any = outerElement[0];
var coordinates = outerHtmlElement.getBBox();
从 TypeScript 1.6 开始,首选的强制转换运算符是as
,因此这些行可以压缩为:
let coordinates = (outerElement[0] as any).getBBox();
当然,如果你想把它做对,这有时是一种矫枉过正,你可以:
HTMLElement
HTMLElement
快速而肮脏的解决方案是显式转换为any
(y as any).x
“优点”是,演员表是明确的,即使noImplicitAny
设置了标志也可以编译。
正确的解决方案是更新类型定义文件。
请注意,当您将变量强制转换为 时any
,您选择退出对该变量的类型检查。
由于我处于免责声明模式,因此通过any
结合新界面进行双重投射,在以下情况下可能很有用
但是,您仍然需要某种形式的打字。
假设您想用y
typeOrginalDef
的新属性修补x
type实例的定义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
。
当 TypeScript 认为"y "上不存在属性"x"时,你总是可以将 "y" 转换为 "any",这将允许你在 "y" 上调用任何东西(如 "x")。
理论
(<any>y).x;
现实世界的例子
对于此代码,我收到错误“TS2339:“功能”类型上不存在属性“名称””:
let name: string = this.constructor.name;
所以我修复了它:
let name: string = (<any>this).constructor.name;
我知道现在是 2020 年,但我看不到满足问题“忽略”部分的答案。事实证明,您可以使用指令告诉 TSLint 这样做;
// @ts-ignore
this.x = this.x.filter(x => x.someProp !== false);
通常这会抛出一个错误,指出'someProp 在类型上不存在'。有了评论,这个错误就消失了。
这将阻止编译时抛出的任何错误,并且还应该阻止您的 IDE 向您抱怨。
在 Angular2 中遇到问题,我正在使用本地存储来保存一些东西,但它不会让我这样做。
解决方案:
我有localStorage.city -> error -> Property 'city' does not exist on type 'Storage'.
如何修复它:
本地存储['城市']
(localStorage).city
(localStorage as any).city
一个没有其他方法的快速修复:
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
我能够使用类似的东西在打字稿中克服这个问题:
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 的键并进行编译的唯一方法。
在我的特定项目中,我无法让它工作,并使用declare var $;
. 不是一个干净/推荐的解决方案,它不能识别 JQuery 变量,但使用它后我没有错误(并且必须让我的自动构建成功)。