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继承的实例。我知道这听起来很奇怪,但我仍然在研究这种方法,看看是否可以在以后简化代码设计。是的,你的第三个评论已经按照我想要的方式修复了它,这对我来说很有意义。我很乐意将其标记为正确答案:-)