这很容易用代码解释:

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应该从SomeRequestApiRequest<T>扩展string的事实推断TResponse,但它不是。相反,它推断{}并且没有错误。
如何在不显式声明类型参数的情况下执行此操作?

最佳答案

不要生成比所需更多的泛型类型参数。如果类型参数只在输入位置出现一次(即不在返回类型中,也不在两个不同的参数中),则将其减少到非约束版本:

function sendRequest<TResponse>(request: ApiRequest<TResponse>): TResponse {
    return null as TResponse;
}

您还需要在T中的某个地方显化ApiRequest
interface ApiRequest<T> {
    structuralTypingMatters: T;
}

10-07 17:19