typescript - 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
,但事实并非如此。相反,它推断{}
并且没有给出错误。
如何在不明确声明类型参数的情况下做到这一点?
解决方案
不要做比你必须做的更多的泛型类型参数。如果一个类型参数只在输入位置出现一次(即不在返回类型中,也不在两个不同的参数中),将其缩减为无约束版本:
function sendRequest<TResponse>(request: ApiRequest<TResponse>): TResponse {
return null as TResponse;
}
您还需要T
在某处显化ApiRequest
:
interface ApiRequest<T> {
structuralTypingMatters: T;
}
推荐阅读
- amazon-web-services - AWS CodeBuild 事件不会触发 lambda
- java - 即使使用 sharedPreferences,AlertDialog 也永远不会显示
- node.js - ESLint 同时输出到文件和控制台
- snowflake-cloud-data-platform - 从雪花外部阶段识别已处理的文件
- c++ - 有没有办法有效地更新 QML 中的 CAN 数据?
- c++ - 在 CGAL 中使用 Efficient_Ransac 时出现问题
- git - 何时避免执行 Git rebase
- apache-kafka - 在 Apache Storm 中处理 kafka 消息时如何确保只使用一次语义
- spring-statemachine - spring-statemachine 2.3.1 - 如何从 StateMachineModelFactory 获取 StateMachine?
- php - 为什么我在 Firefox 上收到空的 g-recaptcha-response