如何让ReSharper承认函数参数的类型正确?

时间:2016-02-03 23:03:02

标签: typescript resharper

我使用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?我在很多地方遇到同样的错误;它不仅仅是一两个。

2 个答案:

答案 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);

PS

只是分享惯例。对于接口/类型声明,优先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已经知道的事情。)