TypeScript泛型类型“ {result:true}”不能分配给类型“ T”

时间:2018-10-03 20:44:15

标签: typescript

尝试使用泛型类型,但我似乎无法使其正常工作,尽管我确信这很简单。这是一个基本示例

// some module
type TMainResponse<T> = {
  data: T;
};

interface Foo {
  func<T>(): Promise<TMainResponse<T>>;
}

// local module
type TLocalResponse = {
  result: boolean;
};

const obj: Foo = {
  async func<TLocalResponse>() {
    return {
      data: {
        result: true
      }
    };
  }
};

(async function () {
  await obj.func();
});

其结果是

Type 'Promise<{ data: { result: boolean; }; }>' is not assignable to type 'Promise<TMainResponse<T>>'.
    Type '{ data: { result: boolean; }; }' is not assignable to type 'TMainResponse<T>'.
      Types of property 'data' are incompatible.
        Type '{ result: boolean; }' is not assignable to type 'T'.

16   async func<TLocalResponse>() {
           ~~~~

  src/test.ts:7:3
    7   func<T>(): Promise<TMainResponse<T>>;
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    The expected type comes from property 'func' which is declared here on type 'Foo'

我是在做错什么,还是只是误解了泛型的使用?

1 个答案:

答案 0 :(得分:0)

  

我是在做错什么,还是只是误解了泛型的使用?

此界面至少有点不典型:

interface Foo {
  func<T>(): Promise<TMainResponse<T>>;
}

Foo没有类型参数,但是<T>在正文中的两个位置使用。老实说,我不太确定应该的工作方式(没有编译错误,因此很可能是按设计工作的,如果有人可以在这里称重,可能会感兴趣),但是如果您更改界面保留类型参数:

interface Foo<T> {
  func(): Promise<TMainResponse<T>>;
}

以及相应的用法:

const obj: Foo<TLocalResponse> = {
  async func() {
    return {
      data: {
        result: true
      }
    };
  }
};

然后the whole thing works fine