首页 > 解决方案 > TypeScript 泛型 - 类型推断

问题描述

我正在尝试在 TypeScript 中重新创建在 C# 中工作的东西。在下面的代码中,我期望两者都是response1response2Promise<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"
});

标签: typescriptgenerics

解决方案


Typescript 使用结构兼容性来实现类型兼容性,因此接口的继承列表之类的东西并不重要,重要的是类型的结构。在您的情况下,IRequest接口根本不使用TResponse类型参数,因此它实际上在结构上等同于{},因此MyRequest扩展此接口无关紧要。如果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"
});

游乐场链接


推荐阅读