以下是什么意思`<tfunction extends =“”function =“”>(target:TFunction)=&gt; TFunction | void`

时间:2016-11-21 08:29:08

标签: typescript

我正在查看lib.d.ts文件,其中包含以下内容:

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

我不太懂语法。有人可以帮忙吗?

我理解的是声明了新类型ClassDecorator。此类型从函数扩展。但这是什么:<TFunction extends Function>?为什么在那里使用箭头?

1 个答案:

答案 0 :(得分:2)

它声明了generic函数的类型,其基本形式为

<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表示您在使用泛型函数时声明的类型必须是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());