【问题标题】:Is there a way to enforce Generic Constraints based on type rather than duck typing?有没有办法根据类型而不是鸭子类型来强制执行通用约束?
【发布时间】:2017-10-10 20:50:53
【问题描述】:

即使SomeQuery1 实现IQueryWithResponse<SomeResponse1> 而不是iQueryWithResponse<SomeResponse2>Tester.test() 方法也会成功编译和运行

export interface IQueryWithResponse<TResponse> {
}

export class SomeQuery1 implements IQueryWithResponse<SomeResponse1> {
}
export class SomeResponse1 {
}

export class SomeQuery2 implements IQueryWithResponse<SomeResponse2> {
}
export class SomeResponse2 {
}

export class Tester {
  public doRequest<TRequest extends IQueryWithResponse<TResponse>, TResponse>(request: TRequest) : TResponse {
    return null;
  }

  public test() {
    let query = new SomeQuery1();
    let response = this.doRequest<SomeQuery1, SomeResponse2>(query);
  }
}

如果这是一种像 C# 这样的语言,由于Tester.doRequest() 的约束,编译器会抛出错误,但在 TypeScript 中,我可以为 TResponse 传递任何类型,只要它实现与我的类型相同的成员期待(在这个例子中绝对是任何东西)。

我希望能够在编译时强制执行这种通用约束检查。或者,至少,有一种方法可以确保 Tester.doRequest 在运行时 request 实现 IQueryWithResponse&lt;TResponse&gt;

也许有办法使用元数据来解决这个问题?

【问题讨论】:

标签: generics typescript typescript2.0


【解决方案1】:

我知道的唯一方法是使用一些常量值来区分接口。它在技术上是相同的“类型”(字符串),但打字稿允许您具体说明其预期值,如果常量不匹配,则会抱怨。

这是一个解决方案;不能说我喜欢。 :P

【讨论】:

  • 谢谢。我认为这不会起作用,因为只有一个通用接口。这是一个工作示例....我希望它不起作用:) 使用 /k2jod7a 查看 tinyurl.com
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-23
  • 2017-08-05
  • 1970-01-01
  • 2018-07-21
  • 2018-10-11
相关资源
最近更新 更多