如何让 Visual Studio Intellisense 显示 javascript 回调中的属性?

How do I get Visual Studio Intellisense to reveal the properties in javascript call back?

export class Helper { 
static forEach(array, callback) {
    jQuery.each<string>(array, (index) => {
        var item = callback({Item: array[index], Continue: true });
        return item.Continue;
    });
}
//how do I get item to Not be type of any?
static Test() {
    var array = [1, 2, 3, 4, 5];
    this.forEach(array, item => {          
      item.  <---  No Intellisense prompt for Item or Continue here.
    });
  }
}

我正在创建一个包含回调的助手 class,正如您在回调中看到的那样,它正在发送一个具有两个属性的对象。测试函数显示了它的使用方式以及我希望它执行的操作。

我试过定义 class 并传递它,但 Intellisense 仍然无法识别类型。

export class ItemContinue {
    constructor(item) {
        this.Item = item;
    }
    Item: any = null;
    Continue: boolean = true;
}

export class Helper { 
static forEach(array, callback) {
    jQuery.each<string>(array, (index) => {
        var item = New ItemContinue(array[index]);
        callback(item);
        return item.Continue;
    });
}

问题是 Helper.forEach 上的 callback 参数没有分配类型。因此它被隐式视为任何。这也意味着它无法为您提供任何补全,因为 any 可以拥有所有属性,而 none.

将上面的代码与此进行比较:

static forEachTyped<T>(array : T[], callback : ({Item: T, Continue: boolean}) =>  {Item: T, Continue: boolean})
{
    jQuery.each<string>(array, (index) => {
        var item = callback({ Item: array[index], Continue: true });
        return item.Continue;
    });        
}    

在这里,我给 callback 参数一个类型 ({Item: T, Continue: boolean}) => {Item : T, Continue : boolean}。这是一个函数的签名,该函数采用 {Item: T, Continue: boolean} 类型的单个参数和 returns 类型 {Item: T, Continue: boolean}.

的值

因为您现在已经为回调函数参数分配了一个类型,所以此函数的 Intellisense 现在运行:

static Test3() {
    var array = [1,2,3,4,5];
    this.forEachTyped<number>(array, (item) => {
        item. // Should provide completion for Continue and Item properties.
        return {Continue: item.Continue, Item: item.Item};
    })
}  

为避免类似问题,您可以将 tsconfig.json 中的 noImplicitAny 设置为 true。每当您的代码分配隐式 any 类型并强制您将类型分配给相关值时,这都会产生错误。