如何创建符合接口的部分Payload?解决TypeScript类型报错问题
问题解决方法
原代码存在的问题
createSharedPayload返回Partial<UserDoc | AdminDoc>,导致展开后的user和consent被标记为可选字段,但UserDoc和AdminDoc中这两个字段是必填项,类型不匹配引发报错。UserDoc里的programs、data定义为string类型,但赋值时使用了数组[],类型冲突。AdminDoc重复定义了已从父接口继承的user和consent字段,属于冗余代码。
修正后的完整代码
// 提取共享字段为基础接口,避免重复定义 export interface SharedDoc { user: string; consent: boolean; } // UserDoc 继承共享字段,补充自身专属字段(修正数组类型匹配赋值) export interface UserDoc extends SharedDoc { programs: string[]; data: string[]; } // AdminDoc 继承共享字段,补充自身专属字段(无需重复定义共享字段) export interface AdminDoc extends SharedDoc { src: string; } // 返回完整的共享字段对象,而非Partial类型 export const createSharedPayload = (): SharedDoc => { return { user: '', consent: false, }; }; // 类型完全匹配,无字段缺失问题 const userPayload: UserDoc = { ...createSharedPayload(), programs: [], data: [] }; const adminPayload: AdminDoc = { ...createSharedPayload(), src: 'some string' };
关键调整说明
- 提取共享字段接口:将
user和consent抽离为SharedDoc,让两个业务接口继承它,从根源避免重复代码。 - 修正类型冲突:把
UserDoc的programs、data改为string[],和赋值的数组类型匹配。 - 调整共享函数返回类型:
createSharedPayload直接返回SharedDoc类型(必填字段的完整对象),展开后不再出现可选字段的问题,确保和目标接口类型兼容。
内容的提问来源于stack exchange,提问作者Richardson
相关产品推荐
相关产品推荐

