2017-12-04 18 views
1

私は活字するには、これらのJavaコンストラクタのオーバーロードを変換する必要があります:私はあそこご覧になることをこれらのコンストラクタを作成しようとした活字体:オーバーロードカスケードのようなコンストラクタ

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) { 
    this.self = self; 
    this.metadata = metadata; 
    this.expandAnyPaths = expandAnyPaths; 
} 

が、私は数字にできていませんでしたどのようにそれを取得する...

任意のアイデア?

constructor(); 
constructor(metadata: QueryMetadata); 
constructor(metadata: QueryMetadata, expandAnyPaths: boolean); 
constructor(self: T); 
constructor(self: T, metadata: QueryMetadata); 
constructor(???) { 
    this.self = self; <<< ??? 
    this.metadata = selfOrMetadata; <<< ??? 
    this.expandAnyPaths = expandAnyPaths; 
} 

答えて

1

単純なデフォルトで、現在のパラメータまたは欠落しているパラメータの組み合わせをサポートすることが実際には望ましいようです。 3つのパラメータでは、8つのオン/オフの組み合わせがあります。したがって、TypeScriptはオーバーロードをサポートしていますが、型の安全性のために8つのオーバーロードを書き出すことは理想的ではありません。

ただし、位置指定ではなく名前付きのパラメータを使用すると、実装が簡単になります。指数関数的に多くの過負荷を書くことなく、より多くのパラメータを簡単に追加できます。

interface QueryMetadata { } 
class DefaultQueryMetadata implements QueryMetadata { } 

interface QueryMixinParams<T> { 
    self: T; 
    metadata: QueryMetadata; 
    expandAnyPaths: boolean; 
} 

class QueryMixin<T> implements QueryMixinParams<T> { 
    self: T; 
    metadata: QueryMetadata; 
    expandAnyPaths: boolean; 

    constructor({ 
     self = null, 
     metadata = new DefaultQueryMetadata(), 
     expandAnyPaths = true, 
     }: Partial<QueryMixinParams<T>> = {}) { 
     this.self = self; 
     this.metadata = metadata; 
     this.expandAnyPaths = expandAnyPaths; 
     console.log(this); 
    } 
} 

// Any combination of parameters is supported 
new QueryMixin(); 
new QueryMixin({}); 
new QueryMixin({ self: {} }); 
new QueryMixin({ self: {}, metadata: {} }); 
new QueryMixin({ self: {}, metadata: {}, expandAnyPaths: false }); 
new QueryMixin({ self: {}, expandAnyPaths: false }); 
new QueryMixin({ metadata: {} }); 
new QueryMixin({ metadata: {}, expandAnyPaths: false }); 
new QueryMixin({ expandAnyPaths: false }); 

Try it in TypeScript Playground

2

タイプスクリプトでは、メソッド/コンストラクタに複数のシグネチャを指定できますが、1つの実装で指定できます。どのオーバーロードが呼び出されたかは、実装次第です。

あなたのケースでは、それは次のようになります。

constructor(); 
constructor(metadata: QueryMetadata); 
constructor(metadata: QueryMetadata, expandAnyPaths: boolean); 
constructor(self: T); 
constructor(self: T, metadata: QueryMetadata); 
constructor() { 
    let self: T = null; 
    let metadata : QueryMetadata = null; 
    let expandAnyPaths = true; 
    if(arguments.length > 0) { 
     // Asuming QueryMetadata is a class 
     if(arguments[0] instanceof QueryMetadata) { 
      expandAnyPaths = arguments[1] || true; 
      metadata = arguments[0]; 
     } 
     else { 
      self = arguments[0] 
      metadata = arguments[1]; 
     } 
    } 

    this.self = self; 
    this.metadata = metadata || new DefaultQueryMetadata();; 
    this.expandAnyPaths = expandAnyPaths; 
} 

注:実装の署名が外の世界から隠され(良いと考えコンストラクタを探しているときすなわちそれは解決のために考慮されません)。このため、空のコンストラクタシグネチャを公開用に2回、実装シグネチャとして1回、空にします。