JavaScript中函数能否用不同参数类型?TypeScript类型判断报错求助
解决TypeScript中接口类型运行时判断的问题
你遇到的这个报错核心原因很简单:TypeScript的接口是编译时类型,编译成JavaScript后就不存在了,而instanceof是运行时的检查手段,自然找不到CourseRaw这个"值"——它只是TypeScript帮你做类型校验的语法糖而已。
下面给你几种可行的解决方案,适配不同的场景:
方案1:自定义类型守卫(最灵活)
因为你的两个接口结构差异明显,我们可以写一个自定义的类型谓词函数,帮TypeScript在运行时判断类型:
// 定义类型守卫函数,告诉TypeScript如何识别CourseRaw function isCourseRaw(raw: CourseRaw | CourseNameSearchRaw): raw is CourseRaw { // 检查raw是否拥有CourseRaw独有的字段(比如metaInfo) return (raw as CourseRaw).metaInfo !== undefined; } static fromRaw(raw: CourseRaw | CourseNameSearchRaw): Course | CourseNameSearch { if (isCourseRaw(raw)) { return { ...raw, metaInfo: MetaInfoFactory.fromRaw(raw.metaInfo), ratingInfo: RatingFactory.fromRaw(raw.ratingInfo), images: ImageFactory.fromRaw(raw.images) }; } else { // 这里TypeScript会自动推断raw是CourseNameSearchRaw return { trackId: raw.trackId, typeCode: raw.typeCode, trackName: raw.trackName // 可根据需求添加其他转换逻辑 }; } }
方案2:使用区分联合类型(更规范)
如果可以修改接口定义,给两个接口加一个共同的判别字段,TypeScript会自动帮你做类型推断,代码会更简洁直观:
// 修改接口,添加type字段作为类型区分标识 export interface CourseRaw { type: 'course'; // 新增判别字段 metaInfo: ...; // 你的原有字段 ratingInfo: ...; images: ...; // 其他原有字段 } export interface CourseNameSearchRaw { type: 'name-search'; // 新增判别字段 trackId: number; typeCode: number; trackName: string; } // 现在fromRaw函数可以直接通过判别字段判断类型 static fromRaw(raw: CourseRaw | CourseNameSearchRaw): Course | CourseNameSearch { if (raw.type === 'course') { return { ...raw, metaInfo: MetaInfoFactory.fromRaw(raw.metaInfo), ratingInfo: RatingFactory.fromRaw(raw.ratingInfo), images: ImageFactory.fromRaw(raw.images) }; } else { return { trackId: raw.trackId, typeCode: raw.typeCode, trackName: raw.trackName }; } }
方案3:直接检查字段存在性(快速临时方案)
如果不想写额外的类型守卫函数,也可以直接在if条件里检查字段是否存在:
static fromRaw(raw: CourseRaw | CourseNameSearchRaw): Course | CourseNameSearch { if ('metaInfo' in raw) { // TypeScript会自动推断raw是CourseRaw return { ...raw, metaInfo: MetaInfoFactory.fromRaw(raw.metaInfo), ratingInfo: RatingFactory.fromRaw(raw.ratingInfo), images: ImageFactory.fromRaw(raw.images) }; } else { return { trackId: raw.trackId, typeCode: raw.typeCode, trackName: raw.trackName }; } }
注意:你的原函数只处理了CourseRaw的情况,漏掉了CourseNameSearchRaw的分支,上面的示例都补全了这个逻辑,确保函数能正确返回两种类型的结果。
内容的提问来源于stack exchange,提问作者user8237421
相关产品推荐
相关产品推荐

