# 泛型

基本用法

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

# 使用泛型类型变量

当类型时数组时,泛型进来的传他的单项的类型

function loggingIdentity<Type>(arg: Type[]): Type[] {
  console.log(arg.length);
  return arg;
}

# 泛型类型

如何来定义一个泛型函数的类型:

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

// 方法1
let myIdentity: <Type>(arg: Type) => Type = identity;
// 方法2 匿名类型
let myIdentity2: { <Type>(arg: Type): Type } = identity;
// 来一个泛型函数的接口
interface GenericIdentityFn {
  <Type>(arg: Type): Type;
}
// 再通用一点
interface GenericIdentityFn<Type> {
  (arg: Type): Type;
}

# 泛型类

跟泛型函数很类似

class GenericNumber<NumType> {
  zeroValue: NumType;
  add: (x: NumType, y: NumType) => NumType;
}

# 泛型约束

使用 extends 关键字来约束泛型

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

# 在泛型约束中使用类型参数

function getProperty<Type, Key extends keyof Type>(obj: Type, key: Key) {
  return obj[key];
}

假设

interface some {
    name: string;
    age: number;
    male: boolean;
}

type Key = keyof some;
// type Key = 'name' | 'age' | 'male';

# 使用泛型中的类类型

function create<Type>(c: { new(): Type }): Type {
  return new c();
}