あなたは後にしているが、あなたはそれを実現するためにチェックするいくつかの種類を実行する必要があり、コンストラクタのオーバーロードを達成することができます...私は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);
オーバーロードのリストの後、実際に実装するシグネチャを指定する必要があります。実際の実装シグネチャは、その前にあるすべてのオーバーロードの交差点である必要があります。そのため、この場合、下部に 'constructor(selfOrMetaData?:T | QueryMetadata ...)'などのように追加する必要があります。代わりに、その時点で型の安全性を持つという偽善を削除して、単に 'constructor(,,, args:any [])'を実行することもできます。 –
私は最後のjavaのようなコンストラクタの実装を追加しました。 'selfOrMetadata'を' self'や 'metadata'に割り当てることができるかどうかを区別する方法はよく分かりません。 – Jordi
両方の引数をオプションにする必要があります( 'selfOrMetaData?')。いずれの引数も指定されていない場合、少なくとも1つのオーバーロードがあるためです。また、2番目の引数は同様に、2番目の位置にあるすべての可能な引数型の和集合である必要があります。 'expandAnyPathsOrMetadata ?: boolean | QueryMetadata'を実行します。 –