TypeScript如何检测对象属性是否为自定义联合类型APhoto
问题根因
TypeScript 的类型系统是静态编译擦除的,所有type、interface定义只会在编译阶段做类型校验,编译为 JavaScript 后会被完全删除。APhoto是仅存在于编译期的类型,没有对应的运行时值,自然无法用于需要运行时参数的instanceof操作。
解决方案:自定义类型守卫
你需要基于StrapiMedia和Photo两个接口的实际字段特征,编写运行时可执行的判断逻辑,也就是TypeScript的类型守卫:
步骤1:编写单元素类型判断
先分别判断单个值是否属于StrapiMedia或Photo,注意将示例中的字段替换为你实际使用的两个接口的独有特征字段:
// 判断是否为StrapiMedia类型,按Strapi媒体的实际字段调整判断条件 function isStrapiMedia(value: unknown): value is StrapiMedia { return typeof value === 'object' && value !== null // 示例:Strapi返回的媒体资源通常带provider、mime、alternativeText等独有字段 && 'provider' in value && 'mime' in value } // 判断是否为Photo类型,按Photo接口的实际字段调整判断条件 function isPhoto(value: unknown): value is Photo { return typeof value === 'object' && value !== null // 示例:Photo通常带width、height、exif等独有字段 && 'width' in value && 'height' in value } // 判断是否为APhoto类型 function isAPhoto(value: unknown): value is APhoto { return isStrapiMedia(value) || isPhoto(value) }
步骤2:编写APhoto数组判断
如果需要判断是否为APhoto[]类型,再加一层数组校验:
function isAPhotoArray(value: unknown): value is APhoto[] { return Array.isArray(value) && value.every(item => isAPhoto(item)) }
步骤3:替换原判断逻辑
for (let key in obj) { if (isAPhotoArray(obj[key])) { // 执行对应逻辑,此时TS会自动将obj[key]推导为APhoto[]类型 } }
内容的提问来源于stack exchange,提问作者Jonas
相关产品推荐
相关产品推荐

