首页 > 解决方案 > 实现由类实现的接口时出现令人困惑的错误

问题描述

我收到以下错误:

输入 '(ctx: any) => Promise<{ user: any; 类别:任何;}>' 不可分配给类型 '((ctx: NuxtContext) => Promise) | 不明确的'

当我在 Typescript 中定义以下类时:

export default class App extends Vue implements NUXT {
  async asyncData(ctx) {
    await ctx.store.dispatch('loadAllCategories');
    const user = ctx.store.state.user;
    const categories = ctx.store.state.categories;
    return { user, categories };
}

其中NUXT是一个接口定义为:

export interface NUXT {
  fetch?: <T = any>(ctx: NuxtContext) => Promise<T>;
  asyncData?: <T = any>(ctx: NuxtContext) => Promise<T>;
  [key: string]: any;
}

export interface NuxtContext {
  state: any;
  process: any;
}

这让我感到困惑,因为我希望实现 NUXT 的类隐式地知道asyncData签名。此外,该错误毫无意义;可以?我的意思是Promise<{ user: any; categories: any; }>退回的符合要求Promise<all>,对吧?

标签: typescript

解决方案


这让我感到困惑,因为我希望实现 NUXT 的类隐式地知道 asyncData 签名。

implements不推断实现方法的类型。它只强制注释是兼容的。这是 TypeScript 设计的。

我的意思是 Promise<{ user: any; 类别:任何;}> 返回将符合 Promise 的要求,对吗?

是的。然而,打字稿并没有推断出返回类型的泛型。以下是该错误的简化版本:

export interface NUXT {
    foo<T>(): Promise<T>
}

export default class App implements NUXT {
    foo(): Promise<null> { // null is not assignable to type T
        return Promise.resolve(null); 
    }
}

推荐阅读