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

函数式声明(function) 方式定义函数

  1. interface Lengthwise {
  2. length: number;
  3. }
  4. function loggingIdentity<T extends Lengthwise>(arg: T): T {
  5. console.log(arg.length); // Now we know it has a .length property, so no more error
  6. return arg;
  7. }

函数表达式(函数字面量)

  1. interface Lengthwise {
  2. length: number;
  3. }
  4. const loggingIdentity = <T extends Lengthwise>(arg: T): T => {
  5. console.log(arg.length); // Now we know it has a .length property, so no more error
  6. return arg;
  7. }

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

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

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

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

参考文档:https://zhongsp.gitbooks.io/typescript-handbook/content/doc/handbook/Generics.html