typescript报错,类型{}不存在属性,这是为什么?

在调取api的时候不知道为什么一直报错无法获取到对应的方法,代码如下

// /apis/index.ts
let apis = {};
const apiContext = require.context("./", true, /\.ts$/);
apiContext.keys().forEach(api => {
  if (api.startsWith("./index")) return;
  const apiModule = apiContext(api);
  apis = { ...apis, ...(apiModule.default || apiModule) };
});
export default apis;

// /store/modules/side.ts
@Module
export default class Aside extends VuexModule {
  menuList = [];

  @Mutation
  [GET_MENU_LIST](payload: any): void {
    this.menuList = payload;
  }

  @Action({ commit: GET_MENU_LIST })
  async getMenuList() {
    return await apis.getMenuList();
  }
}

就是这行apis.getMenuList()报错,Member ‘getMenuList’ implicitly has an ‘any’ type,vscode提示类型“{}”上不存在属性“getMenuList”。
我打印了下apis.getMenuList是个function用来获取接口数据没看出啥问题

回答:

因为你在最开始定义了let apis = {};,ts会自动识别你的apis是一个空的object,并且没有任何东西。所以你在后面想要调用getMenuList的时候TS认为apis里面并不存在你要调用的方法。对于这种动态object,解决办法是手动声明类型let apis: { getMenuList?: Function } = {};,在调用的时候用if检查getMenuList是否存在

回答:

你这也压根没声明啊……既然用了 TS 就按 TS 的要求来,咋还 TS 还原生 JS 混用呢?

简单粗暴的方法就是忽略这个错误,在 tsconfig.json 里:

{
  ...
  "compilerOptions": {
    ...
    "noImplicitAny": false, // 设成 false
  }
  ...
}

暂无评论

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注