TypeScript中与JavaScript的includes()方法等效的方法是什么?

5
使用includes在数组元素上会出现TypeScript错误。当编译成js后,它当然可以正常工作,但我仍然会收到以下TypeScript错误:
“属性'includes'不存在于类型'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
请将boolean[]替换为Array<boolean> - eko
2
https://github.com/Microsoft/TypeScript/issues/2340 - Arun P Johny
1
@echonax 那会有什么区别呢?它们的意思是完全相同的。 - user663031
我不再收到错误信息了,所以肯定有所不同。 - John williams
这个回答解决了你的问题吗?属性“includes”在类型“string []”上不存在 - kaya3
显示剩余3条评论
3个回答

3
就修复编译错误而言,解决编译问题的方法是在我的tsconfig.jsonlib选项中添加es2016。这将在数组上添加必要的includes声明。
我尝试了TypeScript 2.1.4的建议修复方法,用Array<boolean>代替boolean[],但没有任何改变。从逻辑上讲,它不应该有任何区别,因为boolean[]Array<boolean>是一样的


话虽如此,我同意torazaburo的观点,即应该像下面这样实现OP的代码:
validAttrs() {
  return this.required.every(value => this.elm.nativeElement.getAttribute(value) !== null);
}

除了删除不必要的逻辑外,这样做还有一个好处,那就是当回调函数返回一个假值时,every会立即停止检查数组。因为一旦回调函数返回一个假值,后面的元素也没有意义了,因为返回值将必然是false。另一方面,问题中的实现将总是对数组的所有元素执行测试。如果第一个元素未通过测试,则它将不必要地检查数组的其余部分!!

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;
}

我非常怀疑用 Array<boolean> 替换 boolean[] 会有任何区别。它们在语义上是完全相同的。 - user663031
好的,我可以百分之百确定当我的代码读取boolean[]时它出现了错误,但是当我将其更改为Array<boolean>时它没有错误并且编译通过。 - John williams
在Playground中,当我使用boolean[]时,我得到了你报告的错误,即“类型“boolean[]”上不存在属性“includes””。当我将其更改为“Array<boolean>”时,我得到了完全相同的错误,这表明它们在TS中是相同的。根据文档,数组类型可以用两种方式之一编写。第一种方法使用元素类型后跟“[]”来表示该元素类型的数组。第二种方法使用泛型数组类型“Array<elemType>” - user663031

2

你甚至不需要使用includes来完成你想要做的事情。你的代码可以简单地写成:

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

这种方法的优点在于它会在找到第一个空值后停止检查。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接