筛选出具有null或未定义属性的对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了筛选出具有null或未定义属性的对象相关的知识,希望对你有一定的参考价值。

我正在使用AWS开发工具包,看起来很多对象都有无法定义的成员。以下示例适用于S3.Object

  export interface Object {
    /**
     * 
     */
    Key?: ObjectKey;
    /**
     * 
     */
    LastModified?: LastModified;
    /**
     * 
     */
    ETag?: ETag;
    /**
     * 
     */
    Size?: Size;
    /**
     * The class of storage used to store the object.
     */
    StorageClass?: ObjectStorageClass;
    /**
     * 
     */
    Owner?: Owner;
  }

因此,在处理这些对象的列表时,如果成员不是未定义的,我总是必须检查函数顶部。

objects.map(async (object) => {
    if(object.Key) { 
        return
    }
    ...
}

我尝试了以下操作,但没有成功:

const objects = objects.filter(object => object.Key)

但是objects的类型仍然是S3.Object,因此使Key仍然是string|undefined

我也尝试过:

const objects: {Key: string}[] = objects.filter(object => object.Key)

但是我收到以下错误:

Type 'Object[]' is not assignable to type '{ Key: string; }[]'.
  Type 'Object' is not assignable to type '{ Key: string; }'.
    Types of property 'Key' are incompatible.
      Type 'string | undefined' is not assignable to type 'string'.
        Type 'undefined' is not assignable to type 'string'

是否可以通过此属性首先过滤对象?每当处理objects

时,我都想删除对此属性的未定义检查
答案

您可以为此使用类型保护:

interface S3Object {
    Key?: string;
}

interface MyObject {
    Key: string;
}

function isValidObject(obj: S3Object): obj is MyObject {
    return obj.Key !== undefined;
}

let objs1: S3Object[] = [{Key: ''}, {Key: 'test'}, {}, {}];

let objs2: MyObject[] = objs1.filter(isValidObject);

console.log(objs2);

这里isValidObject可以在过滤器中使用,以使编译器知道过滤后的项目属于MyObject类型。

当然可以删除MyObject接口,并用{Key: string}代替

Documentation此功能。

以上是关于筛选出具有null或未定义属性的对象的主要内容,如果未能解决你的问题,请参考以下文章

0x800a138f - JavaScript 运行时错误:属性“$”的值为 null 或未定义,不是函数对象

TypeScript 编译器崩溃:publicMembers 为 null 或未定义

浏览网页:出现错误,无法设置属性“value”的值:对象为null或未定义

当第一个属性为空或未定义时如何使用 ES6 对象解构默认为另一个属性

SignalR:无法获取属性“开始”的值:对象为空或未定义

我无法从结果中筛选出_id?