首页 > 解决方案 > 迭代对象的通用属性,验证它是对象的属性而不是任何字符串(我收到来自编译器的错误)

问题描述

valuesOrCondition$<T>(objects: Observable<T[]>, objectWithPropertiesAndValues: Partial<T>) {

  const properties = Object.keys(objectWithPropertiesAndValues);
  return objects.pipe(  
      map(nodes => nodes.filter(node => 
                                   properties.find(ppName => 
                                   node[ppName] === objectWithPropertiesAndValues[ppName]))),
  );

}

当我执行此代码时,TypeScript 给了我这个错误:

元素隐式具有“任何”类型,因为“字符串”类型的表达式不能用于索引类型“未知”。在“未知”类型上找不到具有“字符串”类型参数的索引签名。

但是objectWithPropertiesAndValuesisPartial<T>这意味着永远将存在于node哪个 is 上T

我理解这个问题,我知道我可以简单地添加any它并且它会起作用。但我想在这里尊重打字稿的方式。

标签: typescripttypescompiler-errors

解决方案


Typescript 有时需要开发人员确定,这就是您有时使用的原因,.?或者!.在这种情况下您需要指定结果是[keyof Partial<T>]or [keyof T]。只是为了保持一致性,请使用第一个。

替换这一行:

const properties = Object.keys(objectWithPropertiesAndValues);

对于这个:

const properties = Object.keys(objectWithPropertiesAndValues) as [keyof Partial<T>];

推荐阅读