Typescript 类型脚本泛型-类型推断

Typescript 类型脚本泛型-类型推断,typescript,generics,Typescript,Generics,我正试图在TypeScript中重新创建一些在C#中工作的东西。 在下面的代码中,我希望response1和response2都是Promise,但response1似乎无法正确推断泛型类型 这可能吗?或者这只是TypeScript不能做的事情 interface IRequest<TResponse> {} interface MyRequest extends IRequest<number> { id: string; } function execut

我正试图在TypeScript中重新创建一些在C#中工作的东西。 在下面的代码中,我希望
response1
response2
都是
Promise
,但
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"
});
接口IRequest{}
接口MyRequest扩展了IRequest{
id:字符串;
}
函数执行(请求:IRequest):承诺{
退货承诺。拒绝(“未执行”);
}
//康斯特回答1:承诺
const response1=执行({
身份证号码:“123”
});
//const response2:承诺
const response2=执行({
身份证号码:“123”
});

Typescript使用结构兼容性来实现类型兼容性,因此像接口的继承列表这样的事情并不重要,重要的是类型的结构。在您的例子中,
IRequest
接口根本不使用
treresponse
类型参数,因此它实际上在结构上等同于
{}
,因此
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"
});
接口IRequest{
_响应?:响应
}
接口MyRequest扩展了IRequest{
id:字符串;
}
函数执行(请求:IRequest):承诺{
退货承诺。拒绝(“未执行”);
}
//康斯特回答1:承诺
const response1=执行({
身份证号码:“123”
});
//const response2:承诺
const response2=执行({
身份证号码:“123”
});

Playway

TResponseas的类型限制是什么?它在中说:“通常,您不应该有未使用的类型参数。该类型将具有意外的兼容性(如图所示),并且在函数调用中也无法进行正确的泛型类型推断。”