首页 > 解决方案 > TypeScript 函数不从超级接口推断泛型参数

问题描述

这最容易用代码解释:

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;

SomeRequest函数 sendRequest 应该从扩展ApiRequest<T>的事实中推断出 TResponse string,但事实并非如此。相反,它推断{}并且没有给出错误。

如何在不明确声明类型参数的情况下做到这一点?

标签: typescriptgenerics

解决方案


不要做比你必须做的更多的泛型类型参数。如果一个类型参数只在输入位置出现一次(即不在返回类型中,也不在两个不同的参数中),将其缩减为无约束版本:

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

您还需要T在某处显化ApiRequest

interface ApiRequest<T> {
    structuralTypingMatters: T;
}

推荐阅读