在实现由类实现的接口时令人困惑的错误

时间:2018-12-13 04:44:06

标签: typescript

我收到以下错误:

  

输入'(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>的要求,对吧?

1 个答案:

答案 0 :(得分:0)

  

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

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

  

我指的是Promise <{用户:任何;类别:任何; }>返回将符合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); 
    }
}