TypeScript中为Microsoft Graph日历查询结果数组配置自定义接口类型时遇错误求助
解决类型定义不匹配的问题
你遇到的错误核心是类型不兼容导致的,主要有两个关键问题:一是你的getMSCalendarBeforeToday方法没有明确指定返回类型,二是你定义的mSCalType接口和实际从API返回的事件对象结构不匹配。下面一步步帮你修复:
1. 给方法明确指定返回类型
目前你的getMSCalendarBeforeToday默认返回Promise<any>,当你把它赋值给mSCalType[]类型的变量时,TypeScript会因为类型不确定而报错。先给这个方法加上明确的返回类型:
async getMSCalendarBeforeToday(userId: number): Promise<mSCalType[]> { // 原有代码... }
2. 对齐接口与实际返回数据的结构
从你的排序逻辑a.start.dateTime能看出来,API返回的事件对象里,start和end都是包含dateTime字段的对象,不是你接口里定义的string类型,这也是类型报错的重要原因。你有两个修复方向:
选项A:扩展接口匹配实际数据结构
如果需要保留事件对象的其他属性(比如bodyPreview),可以扩展接口:
export interface mSCalType { start: { dateTime: string }; end: { dateTime: string }; bodyPreview: string; // 可根据需求添加其他属性,比如id、subject等 }
选项B:只提取需要的属性并转换结构
如果只需要start和end的时间字符串,可以在返回前用map把数据转换成符合接口的结构:
// 在resolve前添加转换逻辑 resolve(myCalendarItems.map(item => ({ start: item.start.dateTime, end: item.end.dateTime })));
此时你的原接口可以保持不变:
export interface mSCalType { start: string, end: string }
3. 优化异步代码(可选但推荐)
你的代码混合了async/await和回调式的request,不仅容易出错,也不利于类型推断。建议把request转成Promise版本,比如用Node.js的util.promisify包装:
import { promisify } from 'util'; const requestPromise = promisify(request); async getMSCalendarBeforeToday(userId: number): Promise<mSCalType[]> { try { const clientId = `${microsoftClientIDforCalendar}`; const secret = `${microsoftSecretforCalendar}`; const tenantId = `${microsoftTenantIdforCalendar}`; const api_url = `https://graph.microsoft.com/v1.0/users/${vacationEmailforCalendar}/calendar/events`; const graphResponse = await msRestNodeAuth.loginWithServicePrincipalSecret(clientId, secret, tenantId, { tokenAudience: "https://graph.microsoft.com/" }); const token = await graphResponse.getToken(); const options = { url: api_url, headers: { 'content-type': 'application/json', 'Authorization': 'Bearer ' + token.accessToken }, }; const response = await requestPromise(options); const parsedBody = JSON.parse(response.body); const myCalendarItems = parsedBody.value.filter(item => +item.bodyPreview == userId); myCalendarItems.sort((a,b) => (a.start.dateTime>b.start.dateTime)? 1 : ((b.start.dateTime > a.start.dateTime) ? -1 : 0)); // 这里根据你的选项选择转换方式 return myCalendarItems.map(item => ({ start: item.start.dateTime, end: item.end.dateTime })); } catch (error) { throw error; } }
这样代码更简洁,也更容易处理错误和类型校验。
最后验证变量定义
完成以上修改后,你的变量定义就能正常工作了:
let MScalendar: mSCalType[] = await this.getMSCalendarBeforeToday(currentUser.Id);
内容的提问来源于stack exchange,提问作者user18460597
相关产品推荐
相关产品推荐

