TypeScript 泛型 - 类型推断

标签 typescript generics

我正在尝试在 TypeScript 中重新创建一些可以在 C# 中运行的东西。 在下面的代码中,我期待 response1response2成为Promise<number> ,但是response1似乎没有正确推断泛型类型。

这可能吗?或者这只是 TypeScript 无法做到的事情?

interface IRequest<TResponse> {}

interface MyRequest extends IRequest<number> {
    id: string;
}

function execute<TResponse>(request: IRequest<TResponse>): Promise<TResponse>{
    return Promise.reject("not implemented");
}

// const response1: Promise<{}>
const response1 = execute(<MyRequest>{
    id: "123"
});

// const response2: Promise<number>
const response2 = execute(<IRequest<number>>{
    id: "123"
});

最佳答案

Typescript 使用结构兼容性来实现类型兼容性,因此接口(interface)的继承列表之类的东西并不那么重要,重要的是类型的结构。在您的情况下,IRequest 接口(interface)根本不使用 TResponse 类型参数,因此它实际上在结构上等同于 {},所以这很重要MyRequest 扩展了这个接口(interface)。如果 IRequest 使用类型参数,推理将按预期工作:

interface IRequest<TResponse> {
  _response?: TResponse
}

interface MyRequest extends IRequest<number> {
    id: string;
}

function execute<TResponse>(request: IRequest<TResponse>): Promise<TResponse>{
    return Promise.reject("not implemented");
}

// const response1: Promise<number>
const response1 = execute(<MyRequest>{
    id: "123"
});

// const response2: Promise<number>
const response2 = execute(<IRequest<number>>{
    id: "123"
});

Playground link

关于TypeScript 泛型 - 类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51007190/

相关文章:

javascript - 如何使用类转换器将 typescript 类转换为纯 javascript 对象

java - Spring 通用事件的事件监听器

Android - Java 泛型 SpinnerAdapter

angular - @angular/common/http/testing TestRequest.flush 一个 boolean 值

typescript - 你如何在 Angular2 中对 NgFor 的结果运行一个函数?

java - 我可以添加到扩展 A 的类型 B 的类型 A 值的通用集合中,而不需要任何特殊语法吗?

C# 从反射类型实例化泛型列表

java - gemfire 教程中的泛型用法

node.js - Nodejs : Failed to load gRPC binary module because it was not installed for the current system

javascript - 单独编译 Angular 组件并在 HTML 页面中一起使用它们