我使用ReSharper 10.0.1与TypeScript 1.7和AngularJS 1.3.6。 ReSharper正在抱怨此部分,错误"提供的参数与调用目标的任何签名都不匹配:参数类型不匹配。参数' s'应该具有可分配给'字符串'的类型,但它具有类型' any'。
items: $ServerTypes.IServerType[] = [a_set_of_Schema.state_objects_with_$type];
var queue: Schema.state[] = [items[0]];
state.transition.forEach((t: Schema.transition) => {
if (!isNaN(parseInt(t.target))) { // ** Error here at t.target
queue.unshift($scope.getStateById(t.target)); // ** Same error at t.target
}
});
Schema.transition和Schema.state的类型非常简单:
declare module MyStuff.Thing.Whatsit.Widget.Whatever.Schema
export interface state {
'id': string
'transition': transition[]
}
export interface transition {
'event': string;
'Items': $ServerTypes.IServerType[]; // an object with a $type property
'name': string;
'target': string;
}
}
我使用import语句来缩短模块名称。 (此导入位于我在每个文件中引用的_references.ts文件中。)
import Schema = MyStuff.Thing.Whatsit.Widget.Whatever.Schema;
关于这一点的奇怪之处在于,Schema.state大多数时候都有一个额外的属性:$ type。此属性允许服务器上的ASP.Net将JSON blob转换为服务器上正确类型的C#类。我找到Schema.state对象的地方是$ ServerTypes.IServerType数组,其中IServerType如下所示:
declare module $ServerTypes {
export interface IServerType {
$type: string
}
}
我希望将$ type保留在Schema.state定义之外,因为它是C#实现细节(大部分)不属于TypeScript代码,我必须创建一些Schema。偶尔在TypeScript代码中声明状态对象。有一组辅助类可以在需要时添加$类型。 (由于JSON.NET限制,$ type必须是JSON对象中的第一个属性。不的TypeScript代码必须关心这个。)
重点是: t.target是一个字符串。 parseInt和$ scope.getStateById都采用单个字符串参数。为什么ReSharper认为t.target不是一个字符串?一切都编译并运行得很好; ReSharper的投诉是唯一的麻烦
我想使用ReSharper,因为它可以帮助我保持代码清洁。但是,如果它会给出错误的错误,那么我将不得不禁用它。有没有办法让它停止抱怨,所以我可以有效地使用ReSharper?我在很多地方遇到同样的错误;它不仅仅是一两个。
答案 0 :(得分:1)
以下代码在Standard TypeScript中正常工作:
export interface transition {
'event': string;
'name': string;
'target': string;
}
var t:transition;
parseInt(t.target);
请注意,Resharper(JetBrains)拥有TypeScript的拥有的实现,因此他们的分析可能与标准 TypeScript的结果不同。
请勿使用引用的成员声明。即尝试以下方法:
export interface transition {
event: string;
name: string;
target: string;
}
var t:transition;
parseInt(t.target);
只是分享惯例。对于接口/类型声明,优先Transition
而不是transition
但如果它会给出错误的错误,那么我将不得不禁用它。有没有办法让它停止抱怨,所以我可以有效地使用ReSharper?我在很多地方遇到同样的错误;它不仅仅是一两个
等待resharper更新。直到那时你可以关闭TypeScript的resharper并仍然将它用于C#等。
答案 1 :(得分:1)
事实证明,ReSharper 10.0.1在寻找进口方面看起来并不是很远。在我的代码中,将MyStuff.Thing.Whatsit.Widget.Whatever.Schema缩短为Schema的import语句位于一个公共项目文件中,距离大约三<reference>
秒。所以这就是罪魁祸首:
import Schema = MyStuff.Thing.Whatsit.Widget.Whatever.Schema;
每次使用长格式强制ReSharper将我的对象视为正确的类型,而不是“任何”,并且我停止了“字符串不是字符串,你需要使用字符串”这一行的荒谬错误。 “不幸的是,这意味着我的代码现在变得毫无意义,因为服务器C#代码(类名最终基于它)具有较长的命名空间。
经过更多的讨论之后,我发现import语句必须在他们将要使用的同一个文件中,并且他们必须在模块定义中,否则他们'所有人都互相冲突。只要我为每个文件创建一个import语句,我就可以拥有缩短的名称。
(这个问题的发生是因为Visual Studio 2015 Update 1能够查看整个解决方案的类型,但ReSharper仍然只能在一个项目中查看。我现在有一小堆小修正专门用于通知ReSharper关于Visual Studio已经知道的事情。)