2017-05-29 7 views
0

ロガーをTypeScriptに移植したところネイティブJavaScriptの実装と比べてコードサイズが驚いた。TypeScriptの `f(... args:any [])`のデッドコード生成を避ける

出典:

class Logger { 
    // …  

    trace(...args: any[]) { 
    this.invoke(TRACE, arguments); 
    } 

    debug(...args: any[]) { 
    this.invoke(DEBUG, arguments); 
    } 
} 

注:...args: any[]コンパイラを満足させるしかありません。 argsは使用されておらず、実装には必要ありません。

活字体が生成します。

Logger.prototype.trace = function() { 
    var args = []; 
    for (var _i = 0; _i < arguments.length; _i++) { 
     args[_i - 0] = arguments[_i]; 
    } 
    this.invoke(TRACE, arguments); 
}; 

バベル(またはWebPACKの/ Uglifyのいくつかの内部を、正確に知っていない)を生成:

… }, { 
    key: "trace", value: function() { 
     for (var e = arguments.length, n = Array(e), t = 0; t < e; t++)n[t] = arguments[t]; 
     this.invoke(s, arguments) 
    } 
}, { 
    key: "debug", value: function() { 
     for (var e = arguments.length, n = Array(e), t = 0; t < e; t++)n[t] = arguments[t]; 
     this.invoke(l, arguments) 
    } 
}, … 

質問:

  1. されていますTypeScriptにメソッドのパラメータを受け入れるように指示する方法がありますが、その方法ではnデッドコードが生成されますか?
  2. そうでない場合、使用されていない引数を無視するようにコンパイラに指示できますか?

なぜ、引数配列が非効率的に変換されるのですか?私はあなたがそれを使用することができます...ので、あなたが使用していない...args: any[]一部から生成されたコードが肥大化している...

答えて

2

をアレイslice方法を使用したい:

trace(...args: any[]) { 
    this.invoke(TRACE, ...args); 
} 

しかし、あなたあなたの方法に別の署名を追加し、引数なしで実際の実装を持つことができますので、「まだ、あなたが望むよりも多くのコードを取得するでしょう:

trace(...args: any[]); 
trace() { 
    this.invoke(TRACE, arguments); 
} 

これのWiコンパイラはメソッドが引数を期待していることをコンパイラが理解できるようにしますが、実装には引数がないため、コードが生成されません。

+0

TypeScriptは非常に驚くほど優れています(使用方法が分かっている場合) - 多くの感謝! – hgoebl

関連する問題