Typescript杂谈(一)

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

可以声明一个类型参数,且它被另一个类型参数所约束。比如想要用属性名从对象中获取这个属性。且确保这个属性在对象上存在,需要在这两个类型之间使用约束。

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

let x = {
  a: 1,
  b: 2,
  c: 3,
  d: 4,
};
console.log(getProperty(x, "a"));
console.log(getProperty(x, "m")); 
//  Argument of type '"m"' is not assignable to parameter of type '"a" | "b" | "c" | "d"'. 

在泛型里使用类类型

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

一个更高级的例子,使用原型属性推断并约束构造函数与类实例的关系

class BeeKeeper {
  hasMask: boolean;
}
class ZooKeeper {
  nameTag: string;
}
class Animal {
  nemLegs: number;
}
class Bee extends Animal {
  keeper: BeeKeeper;
}
class Lion extends Animal {
  keeper: ZooKeeper;
}
function createInstance<A extends Animal>(c: new () => A): A {
  return new c();
}

createInstance(Lion).keeper.nameTag // typechecks
createInstance(Bee).keeper.hasMask // typechecks

上一篇:TypeScript入门版~适合初学者快速学习。


下一篇:你应该知道的TypeScript基础知识