本系列文章只为记忆使用,非一步一步学习资料。
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
}