【发布时间】: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<TResponse>
也许有办法使用元数据来解决这个问题?
【问题讨论】:
-
在运行时你可以检查你得到的值并决定它是否合适,如果不合适则抛出错误。您可以查看此问题:Support some non-structural (nominal) type matching,了解如何解决 typescript 的鸭式打字性质
标签: generics typescript typescript2.0