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

时间:2019-10-03 07:01:36

标签: typescript

我正在使用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

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

1 个答案:

答案 0 :(得分:1)

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

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此功能。