这很容易用代码解释:
interface ApiRequest<T> {}
interface SomeRequest extends ApiRequest<string> {
value: string;
}
function sendRequest<
TRequest extends ApiRequest<TResponse>,
TResponse
>(
request: TRequest
): TResponse {
return null as TResponse;
}
const x = sendRequest({ value: "a value" } as SomeRequest);
// Type of x is inferred as {} rather than string
x.length;
函数sEnDestRebug应该从
SomeRequest
用ApiRequest<T>
扩展string
的事实推断TResponse,但它不是。相反,它推断{}
并且没有错误。如何在不显式声明类型参数的情况下执行此操作?
最佳答案
不要生成比所需更多的泛型类型参数。如果类型参数只在输入位置出现一次(即不在返回类型中,也不在两个不同的参数中),则将其减少到非约束版本:
function sendRequest<TResponse>(request: ApiRequest<TResponse>): TResponse {
return null as TResponse;
}
您还需要在
T
中的某个地方显化ApiRequest
:interface ApiRequest<T> {
structuralTypingMatters: T;
}