2017-11-28 3 views
1

私は活字するには、これらのJavaコンストラクタのオーバーロードを変換する必要があるのオーバーロードコンストラクタそれを得る...活字体:

アイデア?

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>>>に私はこのコンパイルメッセージが出ています:

過負荷の署名が機能の実装と互換性がありません。

+3

オーバーロードのリストの後、実際に実装するシグネチャを指定する必要があります。実際の実装シグネチャは、その前にあるすべてのオーバーロードの交差点である必要があります。そのため、この場合、下部に 'constructor(selfOrMetaData?:T | QueryMetadata ...)'などのように追加する必要があります。代わりに、その時点で型の安全性を持つという偽善を削除して、単に 'constructor(,,, args:any [])'を実行することもできます。 –

+0

私は最後のjavaのようなコンストラクタの実装を追加しました。 'selfOrMetadata'を' self'や 'metadata'に割り当てることができるかどうかを区別する方法はよく分かりません。 – Jordi

+0

両方の引数をオプションにする必要があります( 'selfOrMetaData?')。いずれの引数も指定されていない場合、少なくとも1つのオーバーロードがあるためです。また、2番目の引数は同様に、2番目の位置にあるすべての可能な引数型の和集合である必要があります。 'expandAnyPathsOrMetadata ?: boolean | QueryMetadata'を実行します。 –

答えて

2

あなたは後にしているが、あなたはそれを実現するためにチェックするいくつかの種類を実行する必要があり、コンストラクタのオーバーロードを達成することができます...私は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); 
+0

[here](https://stackoverflow.com/questions/47635483/typescript-overloading-cascade-like-constructors)に関連する質問を作成するために、新しい投稿を作成しました。違いは、最後のコンストラクタがすべての可能性を集めることができることです。 – Jordi