2016-12-21 81 views
2

使用包含在數組元素上的TypeScript錯誤。當然,一旦編譯成js的它工作正常,但我仍然得到以下打字稿錯誤:JavaScript的TypeScript等效包括()

Property 'includes' does not exist on type 'boolean[]'

代碼:

validAttrs() { 
    let valid: boolean[] = this.required.map((value, index) => { 
    if(this.elm.nativeElement.getAttribute(value) === null) { 
     return false; 
    }; 
    return true; 
    }); 
    return valid.includes(false) ? false : true; 
} 
+4

嘗試更改'布爾[]''陣列' – echonax

+2

https://github.com/Microsoft/TypeScript/issues/2340 –

+1

@echonax會有什麼不同?它們意義相同。 –

回答

2

@ echonax的評論爲我工作。

validAttrs() { 
    let valid: Array<boolean> = this.required.map((value, index) => { 
    if(this.elm.nativeElement.getAttribute(value) === null) { 
     return false; 
    }; 
    return true; 
    }); 
    return valid.includes(false) ? false : true; 
} 
+0

我很懷疑用'Array '替換'boolean []'會有什麼區別。它們在語義上是相同的。 –

+0

好吧,所以我100%肯定,當我的代碼讀取布爾[]然後它出錯了我,但是當我將其更改爲數組它沒有錯誤並complied。 –

+0

在操場上,當我使用'boolean []'時,我得到了你報告的錯誤,即'屬性'包含'在類型'boolean []''上不存在「。當我將其更改爲'Array '時,我得到了完全相同的錯誤,表明對於TS他們是一樣的。根據文檔,*數組類型可以用兩種方式之一來編寫。在第一個中,您使用的元素類型後跟'[]'來表示該元素類型的數組。第二種方法使用通用數組類型'Array '*。 –

2

你甚至都不需要includes爲你正在嘗試做的。您的代碼可以簡單地爲

validAttrs() { 
    return this.required.every(value => this.elm.nativeElement.getAttribute(value) !== null); 
} 

這也有一個好處,它將停止檢查它發現第一個空值的分鐘。

2

至於固定編譯錯誤去,固定的編制問題在我tsconfig.json添加es2016lib選項。這在陣列上添加了必要的includes聲明。

我試着用TypeScript 2.1.4 suggested fix替換boolean[]Array<boolean>。它沒有任何區別。從邏輯上說,它不應該有所作爲,因爲boolean[]Array<boolean>是相同的東西


這是說,我與torazaburo同意該OP的代碼應被實現爲:

validAttrs() { 
    return this.required.every(value => this.elm.nativeElement.getAttribute(value) !== null); 
} 

除了去除不必要的邏輯,這也只要具有以下優點:every停止檢查陣列回調返回一個虛假值。檢查其餘部分沒有意義,因爲一旦回調返回一個虛假值,返回值必然是false。另一方面,在問題執行中將總是對數組的所有元素執行測試。如果第一個元素沒有通過測試,那麼它將不必要地檢查數組的其餘部分!