我正在使用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
答案 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此功能。