TypeScript学习之(5)--泛型,枚举

本系列文章只为记忆使用,非一步一步学习资料。

1.泛型的格式(先记住形式吧,和C#的一样)

function identity<T>(arg: T): T {
    return arg;
}

使用泛型函数

let output = identity<string>("myString");  // type of output will be 'string'
let output = identity("myString");  // type of output will be 'string',自动推断

2.泛型接口,记住格式吧

interface GenericIdentityFn<T> {
    (arg: T): T;
}

function identity<T>(arg: T): T {
    return arg;
}

let myIdentity: GenericIdentityFn<number> = identity;

3.泛型类:

class GenericNumber<T> {
    zeroValue: T;
    add: (x: T, y: T) => T;//这个方法必须被赋值才能使用
}

let myGenericNumber = new GenericNumber<number>();
myGenericNumber.zeroValue = 0;
myGenericNumber.add = function(x, y) { return x + y; };//赋值,这个地方没有T了

类有两部分:静态部分和实例部分。 泛型类指的是实例部分的类型,所以类的静态属性不能使用这个泛型类型。

4.泛型约束
我们定义一个接口来描述约束条件。 创建一个包含 .length属性的接口,使用这个接口和extends关键字还实现约束:

interface Lengthwise {
    length: number;
}

function loggingIdentity<T extends Lengthwise>(arg: T): T {
    console.log(arg.length);  // Now we know it has a .length property, so no more error
    return arg;
}

现在这个泛型函数被定义了约束,因此它不再是适用于任意类型:

 loggingIdentity(3);  // Error, number doesn't have a .length property

我们需要传入符合约束类型的值,必须包含必须的属性:

loggingIdentity({length: 10, value: 3});

5.枚举

enum Direction {
    Up = 1,
    Down,
    Left,
    Right
}

6.枚举是在运行时真正存在的一个对象。 其中一个原因是因为这样可以从枚举值到枚举名进行反向映射。

enum Direction {
    Up = 1,
    Down,
    Left,
    Right
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容