我需要将这些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>>>
我收到了这封编辑信息:
重载签名与功能实现不兼容。
答案 0 :(得分:3)
你可以实现你所追求的构造函数重载,但你必须执行一些类型检查才能实现它...我不知道QueryMetadata
的样子,但你应该能够从这个自成一体的例子中得到想法。
我使用自定义类型保护来分隔这些联合类型:
interface QueryMetadata {
metadata: string;
}
function isQueryMetadata(obj: any): obj is QueryMetadata {
return (obj && obj.metadata);
}
class Example<T> {
private metadata: QueryMetadata;
private self: T;
private expandAnyPaths: boolean;
constructor(metadata: QueryMetadata);
constructor(metadata: QueryMetadata, expandAnyPaths: boolean);
constructor(self: T);
constructor(self: T, metadata: QueryMetadata);
constructor(selfOrMetadata: T | QueryMetadata, expandOrMetadata: boolean | QueryMetadata = false) {
if (isQueryMetadata(selfOrMetadata)) {
this.metadata = selfOrMetadata;
} else {
this.self = selfOrMetadata;
}
if (isQueryMetadata(expandOrMetadata)) {
this.metadata = expandOrMetadata;
} else {
this.expandAnyPaths = expandOrMetadata;
}
}
}
如果您正在撰写新内容,您可能更愿意使用工厂方法来构建您的课程......
interface QueryMetadata {
metadata: string;
}
class Example<T> {
private metadata: QueryMetadata;
private self: T;
private expandAnyPaths: boolean;
protected constructor() { }
static fromMetadata<T>(metadata: QueryMetadata, expandAnyPaths: boolean = false) {
const example = new Example<T>();
example.metadata = metadata;
example.expandAnyPaths = expandAnyPaths;
}
static fromSelf<T>(self: T, expandAnyPaths: boolean = false) {
const example = new Example<T>();
example.self = self;
example.expandAnyPaths = expandAnyPaths;
}
}
const example1 = Example.fromSelf('Some Value');
const example2 = Example.fromSelf('Some Value', true);
const example3 = Example.fromMetadata({ metadata: 'val' });
const example4 = Example.fromMetadata({ metadata: 'val' }, true);