2017-08-13 11 views
0

以下のTypeScriptでは、戻り値の型を明示的に宣言しようとしている点を除き、両方の関数は同じです。demoTwo。戻り型は、それ自身が入力として関数をとる関数です。私の質問は、なぜなぜそれが使用されないと仮定すると、パラメータ名を与える必要がありますか?その位置に何かがなければ、コードはコンパイルされません。TypeScriptのラムダ戻り型のシグニチャー

function demoOne() { 
    return function(input:() => string) : void { 
     var result = input(); 
     console.log("Foo:",result); 
    } 
} 

function demoTwo(): (whyThis:() => string) => void { 
    return function(input:() => string) : void { 
     var result = input(); 
     console.log("Bar:",result); 
    } 
} 

var sampleInput =() => "wibble"; 
demoOne()(sampleInput); 
demoTwo()(sampleInput); 

私はここにScalaでは同等のコードだ求めているものを明確にする:

function demoTwo(): (whyThis:() => string) => void { //TS 
def demoTwo(): (() => String) => Unit = { //Scala 
:我々は、我々が持っている側の demoTwo側の宣言を設定した場合

object Program { 
    def demoTwo(): (() => String) => Unit = { 
    def tmp(input:() => String): Unit = { 
     val result = input() 
     println("Bar: " + result) 
    } 
    return tmp 
    } 
    def main(args: Array[String]): Unit = { 
    val sampleInput =() => "wibble" 
    demoTwo()(sampleInput) 
    } 
} 

唯一の主な違いは、TSがで何かを必要としていることです。なぜなら、このの位置とScalaはそうではありません。なぜこれが当てはまるべきですか?

答えて

1

typescriptのすべての関数パラメータは、使用するかどうかにかかわらず、名前を持つ必要があります。あなたが追加しているのは、コールシグネチャです。これは実行時には使用されませんが、コードの作成時に役立ちます。

あなたが例の両方のために生成されたJavaScriptファイルを見ると、彼らは両方の出力まったく同じコードになります。

function demoOne() { 
    return function (input) { 
     var result = input(); 
     console.log("Foo:", result); 
    }; 
} 
function demoTwo() { 
    return function (input) { 
     var result = input(); 
     console.log("Bar:", result); 
    }; 
} 

EDITは:パラメータは、実行時に使用されることはありませんその中であなたは、正しいですこれらのパラメータはコンパイル時に表示されます(エディタによって異なります)。コールシグネチャを追加しないと、エディタは実行時パラメータから推論し、コンパイル時にこれを表示します。あなたはあなたのことを考えることができ

は、他のコードが使用されているどのように人々とどのようなパラメータは、あなたのコードを消費します人々のために非常に理解しやすいように書かれて、表現するために通信する方法として、署名を呼び出します。ここで

は、Visual Studioがあなたの機能の上にhooveringたときにこれらの関数を呼び出すときに、これらのコードの定義もVSCodeや他のエディタに表示示しものです:

デモ1:

enter image description here

デモ2 :

enter image description here

+0

実際にはそうです。しかし、私の質問はあなたの声明に関連しています。この場合、パラメータ** whyThis **は決して使用できないので、これは単にTypescript仕様の見落としであるか、それとも私が見ていない何らかの目的がありますか? –

+0

あなたの質問に答えるために私の答えを少し編集しましたが、その話題がまだ不明な場合は教えてください。 – hagner

+0

ありがとうございます。何らかの理由で画像が見えません。また、私はあなたが何を求めているのか分かりません。うまくいけば明らかにするコードのScala版を追加しました。 –

1

私は混乱ステムを考えます署名が定義されている方法からです。最後の二つのタイプの数の引数を取るvoid型関数の署名です

(number) => Void 
(x : number) => Void 
(_ : number) => Void 

下の3人の署名を注意してください。しかし、最初の関数は、Any型のargumnetを名前番号で受け取る関数です。したがって、言語には型の後に名前が必要です。型が省略されている場合は、Any型が引き継がれます。

ので、

(() => string) => void 

「()=>文字列」として有効ではありませんが、有効な名前ではなく、コンパイラがそのように解析しようと混乱しています。

最短フォームは '_:タイプ'を使用します。

しかし、私は名前を省略し、タイプのみを使用しているか、名前をオプションにしておくほうがよかったと思います。私はなぜ彼らがデザインの決定を下したのか分からず、おそらく既存のJavaScriptの関数(型なし)との混乱を避けるためです。

+0

それは優れた明確化ですが、(あなたが言うように)それはまだ彼らが最初にその意思決定をした謎なのです。それは私が本当に最下位に到達しようとしていることです... –

関連する問題