筛选出具有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或未定义