Typescript 任何类型的泛型约束
为了解释我的问题,我必须开始显示我的代码 我的泛型类:Typescript 任何类型的泛型约束,typescript,Typescript,为了解释我的问题,我必须开始显示我的代码 我的泛型类: export class RpcPublisherMessage<T extends RpcPublisherRequest<T>> { constructor(public publisherRequest: T, public publishOptions: Options.Publish = {}, public timeoutMs?: number) {} } export class RpcPubli
export class RpcPublisherMessage<T extends RpcPublisherRequest<T>> {
constructor(public publisherRequest: T, public publishOptions: Options.Publish = {}, public timeoutMs?: number) {}
}
export class RpcPublisherRequest<T> extends RpcMessageData<T> {
constructor(payload: T, private context: string) {
super(payload);
}
public toBuffer(): Buffer {
return Buffer.from(...);
}
}
public async dispatchMessage(rpcMessage: RpcPublisherMessage<any>): Promise<IRequestMessageResponse> {
const message = rpcMessage.publisherRequest; // I can not call toBuffer() here
}
导出类RpcPublisherMessage{
构造函数(public publisherRequest:T,public publishOptions:Options.Publish={},public timeoutMs?:number){}
}
导出类RpcPublisherRequest扩展了RpcMessageData{
构造函数(有效负载:T,私有上下文:string){
超级(有效载荷);
}
公用toBuffer():缓冲区{
返回缓冲区。从(…);
}
}
我的问题:
export class RpcPublisherMessage<T extends RpcPublisherRequest<T>> {
constructor(public publisherRequest: T, public publishOptions: Options.Publish = {}, public timeoutMs?: number) {}
}
export class RpcPublisherRequest<T> extends RpcMessageData<T> {
constructor(payload: T, private context: string) {
super(payload);
}
public toBuffer(): Buffer {
return Buffer.from(...);
}
}
public async dispatchMessage(rpcMessage: RpcPublisherMessage<any>): Promise<IRequestMessageResponse> {
const message = rpcMessage.publisherRequest; // I can not call toBuffer() here
}
public async dispatchMessage(rpcMessage:RpcPublisherMessage):承诺{
const message=rpcMessage.publisherRequest;//我不能在这里调用toBuffer()
}
这就是我想使用RpcPublisherMessage
实例的地方。由于RpcPublishermessage有一个通用约束,我希望能够对publisherRequest属性调用toBuffer()
,但显然我没有
我试图解决的问题:
export class RpcPublisherMessage<T extends RpcPublisherRequest<T>> {
constructor(public publisherRequest: T, public publishOptions: Options.Publish = {}, public timeoutMs?: number) {}
}
export class RpcPublisherRequest<T> extends RpcMessageData<T> {
constructor(payload: T, private context: string) {
super(payload);
}
public toBuffer(): Buffer {
return Buffer.from(...);
}
}
public async dispatchMessage(rpcMessage: RpcPublisherMessage<any>): Promise<IRequestMessageResponse> {
const message = rpcMessage.publisherRequest; // I can not call toBuffer() here
}
我认为这可能是因为RpcPublisherMessage
中的任何函数也可能需要给定的约束,但函数参数中类似于rpcMessage:RpcPublisherMessage
的函数没有起作用。VSCode然后说
[ts]导出类的公共方法的参数“rpcMessage”已被删除
或者正在使用私有名称“”
我的问题:
export class RpcPublisherMessage<T extends RpcPublisherRequest<T>> {
constructor(public publisherRequest: T, public publishOptions: Options.Publish = {}, public timeoutMs?: number) {}
}
export class RpcPublisherRequest<T> extends RpcMessageData<T> {
constructor(payload: T, private context: string) {
super(payload);
}
public toBuffer(): Buffer {
return Buffer.from(...);
}
}
public async dispatchMessage(rpcMessage: RpcPublisherMessage<any>): Promise<IRequestMessageResponse> {
const message = rpcMessage.publisherRequest; // I can not call toBuffer() here
}
为什么我不能在
publisherRequest
上调用toBuffer()
,即使我为此属性指定了约束条件?详细说明我的注释作为答案
旁白:以下定义
export class RpcPublisherMessage<T extends RpcPublisherRequest<T>> { ... }
这不再是递归类型绑定
梅因:你有这个问题吗
public async dispatchMessage(
rpcMessage: RpcPublisherMessage<any>
): Promise<IRequestMessageResponse> {
const message = rpcMessage.publisherRequest.toBuffer(); // no error
const massage = rpcMessage.publisherRequest.toButter(); // also no error
}
这会解决你的问题。如果您需要跟踪请求类型的特定有效负载类型,您可以始终使用dispatchMessage()
这样的通用方法:
public async dispatchMessage<P>(
rpcMessage: RpcPublisherMessage<RpcPublisherRequest<P>>
): Promise<IRequestMessageResponse> {
const message = rpcMessage.publisherRequest.toBuffer(); // no error
}
public async dispatchMessage(
rpcMessage:RpcPublisherMessage
):承诺{
const message=rpcMessage.publisherRequest.toBuffer();//无错误
}
其中p
是您的通用有效负载类型。但你可能不需要走那么远
好吧,希望这有帮助;祝你好运 “显然我不是”是什么意思?你给了它一个
any
类型,所以你可以在上面调用任何你想要的东西。你看到了什么错误?或者,您是否将缺少智能感知暗示解释为您不能称之为智能感知暗示?class RpcPublisherMessage
不太可能做您想做的事情;你真的想让T
成为RpcPublisherRequest
的有效负载类型吗?您可能只是指T扩展RpcPublisherRequest
或其他什么。您的问题的解决方法可能是rpcMessage:RpcPublisherMessage
,因此IntelliSense将提示您有关toBuffer()
。我很乐意写下这些作为答案,但我对你的问题感到困惑,不确定这是否是你想要的。@jcalz我希望T成为一个从RpcPublisherRequest继承的实例。我知道这听起来很奇怪,但我仍然在研究这种方法,看看是否可以在以后简化代码设计。是的,你的第三个评论已经按照我想要的方式修复了它,这对我来说很有意义。我很乐意将其标记为正确答案:-)