You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 18:03:03