【发布时间】: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