【发布时间】:2017-11-29 08:05:08
【问题描述】:
我需要将这些 Java 构造函数重载转换为 Typescript:
public QueryMixin() {
this(null, new DefaultQueryMetadata(), true);
}
public QueryMixin(QueryMetadata metadata) {
this(null, metadata, true);
}
public QueryMixin(QueryMetadata metadata, boolean expandAnyPaths) {
this(null, metadata, expandAnyPaths);
}
public QueryMixin(T self) {
this(self, new DefaultQueryMetadata(), true);
}
public QueryMixin(T self, QueryMetadata metadata) {
this(self, metadata, true);
}
public QueryMixin(T self, QueryMetadata metadata, boolean expandAnyPaths) {//...}
我已经尝试创建这些构造函数来看看那里,但我无法弄清楚如何获得它......
有什么想法吗?
constructor(); <<<1>>>
constructor(metadata: QueryMetadata);
constructor(metadata: QueryMetadata, expandAnyPaths: boolean);
constructor(self: T);
constructor(self: T, metadata: QueryMetadata);
constructor(selfOrMetadata: T | QueryMetadata, expandAnyPaths: boolean) {
this.self = selfOrMetadata; <<< PROBLEM HERE
this.metadata = selfOrMetadata; <<< PROBLEM HERE
this.expandAnyPaths = expandAnyPaths;
}
在<<<1>>> 我收到这条编译消息:
重载签名与函数实现不兼容。
【问题讨论】:
-
在重载列表之后,您必须提供实际的实现签名,它必须(粗略地说)它之前的所有重载的交集。所以在这种情况下,您必须在底部添加:
constructor(selfOrMetaData?: T | QueryMetadata ...)等等。或者,您可以在那时放弃任何类型安全的假装,然后执行constructor(,,,args: any[])。 -
我添加了最后一个类似 java 的构造函数实现。我不太清楚如何区分
selfOrMetadata是否可以分配给self或metadata。 -
您需要将两个参数都设为可选 (
selfOrMetaData?),因为至少有一个重载没有提供任何参数。此外,您的第二个参数同样需要是第二个位置中所有可能的参数类型的联合。expandAnyPathsOrMetadata?: boolean | QueryMetadata. -
你介意给我一个答案吗?