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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 22:12:35