我正在尝试在 TypeScript 中重新创建一些可以在 C# 中运行的东西。
在下面的代码中,我期待 response1
和response2
成为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/