2016-11-21 9 views
0

私はlib.d.tsファイルを探していますし、そこに以下があります:次の意味は?<TFunction extends Function>(target:TFunction)=> TFunction | void`

declare type ClassDecorator = <TFunction extends Function>(target: TFunction) => TFunction | void; 

私はかなりの構文を理解していません。誰も助けることができますか?

私が理解していることは、新しいタイプClassDecoratorが宣言されていることです。この型は関数から拡張されています。しかし、これは何ですか:<TFunction extends Function>?なぜそこに矢印が使われているのですか?

答えて

2

それは

<T>(target: T) => T | void; 

type MyFuncType = <T>(target: T) => T | void; 

var myFunc: MyFuncType = <T>(target: T) => { 
    return target; 
} 

var stringOrVoidResult = myFunc<string>("test"); 
var numberOrVoidResult = myFunc<number>(123); 

TFunction extends Functionの塩基形態でgeneric関数の種類を宣言していますが、あなたが一般的な関数を宣言しているタイプがあることを意味しますそれを使用するときは、すべてのクラスであるタイプFunctionでなければなりません。上記の例で

class Animal { 
    Eat:() => void; 
    Sleep:() => void; 
} 

type MyFuncType = <T extends Animal>(target: T) => T | void; 

var myFunc: MyFuncType = <T>(target: T) => { 
    return target; 
} 

var stringOrVoidResult = myFunc<string>("test"); // Error, string is not a subtype of Animal 
var numberOrVoidResult = myFunc<number>(123); // Error, number is not a subtype of Animal 

class Dog extends Animal { 

} 

var dogOrVoidResult = myFunc<Dog>(new Dog()); //Ok, Dog is Animal 

、あなたは本当に、コンパイラは入力引数からということを理解できるよう機能のジェネリック型を指定する必要はありません。それは必ずしもそうではありませんが。

var stringOrVoidResult = myFunc("test"); 
var numberOrVoidResult = myFunc(123); 
var dogOrVoidResult = myFunc(new Dog()); 
+0

ありがとうございます、あなたは 'の基本形で'を少し詳しく説明できますか?おそらくそのようなタイプの関数の例を表示してください –

+0

@ Maximus今はっきりしていますか? – Alex

+0

理解しようとしています... –

関連する問題