TypeScript泛型-类型推断

Rus*_*mer 2 generics typescript

我正在尝试在TypeScript中重新创建可在C#中工作的东西。在下面的代码中,我期望response1response2都为a 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"
});
Run Code Online (Sandbox Code Playgroud)

Tit*_*mir 5

Typescript使用结构兼容性来实现类型兼容性,因此诸如接口的继承列表之类的东西并不重要,重要的是类型的结构。在您的情况下,该IRequest接口根本不使用TResponsetype参数,因此它在结构上实际上等效于{},因此MyRequest扩展此接口将无关紧要。如果IRequest使用type参数,则推断将按预期进行:

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"
});
Run Code Online (Sandbox Code Playgroud)

游乐场链接

  • 正如[FAQ](https://github.com/Microsoft/TypeScript/wiki/FAQ#why-is-astring-assignable-to-anumber-for-interface-at--)中所说的:“通常,您永远不要拥有未使用的类型参数。该类型将具有意外的兼容性(如下所示),并且在函数调用中也将无法进行正确的泛型类型推断。” (2认同)