在VS2013中,当tsc使用代码1退出时,构建停止。但在VS2012中却不是这样。

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

我得到许多属性'x'不存在的值类型'y'错误,我想忽略使用javascript函数时。


当前回答

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

理论

(<any>y).x;

现实世界中的例子

我得到了这个代码的错误“TS2339:属性“名称”在类型“函数”上不存在”:

let name: string = this.constructor.name;

所以我用:

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

其他回答

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

快速而简单的解决方案是显式强制转换为any

(y as any).x

“优点”是,强制转换是显式的,即使设置了noImplicitAny标志,也可以进行编译。

正确的解决方案是更新类型定义文件。

请注意,当您将变量强制转换为任意类型时,您将选择不进行该变量的类型检查。


因为我在免责模式,双强制转换通过任何结合一个新的界面,可以是有用的情况下

您不希望更新损坏的类型文件 而且/或者你是猴子补丁

然而,您仍然需要某种形式的输入。

假设你想用一个类型为number的新属性x来修补类型为originaldef的y实例的定义:

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"//给出typescript错误

Y ["x"] = "some custom property"//没有错误

注意,要访问x并且不再得到typescript错误,你需要像y["x"]那样写它,而不是y.x。所以从这个角度来看,其他选项更好。

我能够在typescript中使用类似的东西来解决这个问题:

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

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

理论

(<any>y).x;

现实世界中的例子

我得到了这个代码的错误“TS2339:属性“名称”在类型“函数”上不存在”:

let name: string = this.constructor.name;

所以我用:

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