【问题标题】:Implement non-generic interface containing generic method [duplicate]实现包含泛型方法的非泛型接口
【发布时间】:2021-11-17 17:21:00
【问题描述】:

我有以下接口,其中包含通用方法签名:

interface IFetcher {
  fetch<T>(): T;
}

我想在单元测试中模拟它,所以我尝试了:

const mockFetch: IFetcher = {
  fetch: (): T => {
    return {} as T;
  }
}

但我收到以下错误:

找不到名称“T”。

我尝试过的其他变体:

const mockFetch: IFetcher = {
  fetch: <T>(): T  => {
    return {} as T;
  }
}

导致

找不到名称“React”。

const mockFetch: IFetcher = {
  fetch<T>: (): T => {
    return {} as T;
  }
}

导致

类型 '() => () => any' 不能分配给类型 '() => T'。 类型 '() => any' 不能分配给类型 'T'。 'T' 可以用与 '() => any' 无关的任意类型来实例化。

这行得通:

const mockFetch: IFetcher = {
  fetch: (): any => {
    return {};
  }
}

但我不想使用any

这也有效,但引入了另一种类型:

interface A {
}

const mockFetch: IFetcher = {
  fetch:<A extends unknown>(): A => {
    return {} as A;
  }
}

实现这个接口的正确方法是什么,尽可能保持类型安全?

【问题讨论】:

    标签: typescript


    【解决方案1】:

    在 tsx 文件中,&lt;T&gt; 将被解释为 JSX 标记的开始。您可以添加一个,,这将说服 typescript 这是一个类型参数列表而不是 JSX 标记(类型参数列表中允许使用尾随逗号)

    const mockFetch: IFetcher = {
      fetch: <T,>(): T  => {
        return {} as T;
      }
    }
    

    Playground Link

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-25
      • 2017-11-13
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多