2017-02-18 31 views
0
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. 
    }); 
    } 
} 

我創建了一個包含回調的助手類,就像你在回調中看到的那樣,它發送的是具有兩個屬性的對象。 Test函數顯示了它如何使用以及我希望它做什麼。如何獲取Visual Studio Intellisense以顯示javascript回調中的屬性?

我已經嘗試了定義一個類並將其傳遞給它,但仍然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; 
    }); 
} 

回答

1

的問題是,在Helper.forEachcallback參數不具有類型分配。因此它是暗含視爲任何。這也意味着它不能爲您提供任何完成,因爲any可以具有所有屬性並且沒有。

比較你的代碼上面這樣的:

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}類型的單個參數並返回類型{Item: T, Continue: boolean}的值。

因爲你現在已經分配了一個類型的回調函數的參數,智能感知此功能目前經營:

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.jsontrue可以設置noImplicitAny類似的問題。只要你的代碼分配一個隱含的any類型並強制你爲有問題的值賦值一個類型,這會產生錯誤。

相關問題