泛型参数也可以继承

比方说想通过属性名从对象里获取属性值,要确保这个属性存在于对象上,可以对泛型加以约束。

function getProperty<T, K extends keyof T>(o: T, k: K) {
  return o[k]
}

class Foo {
  a: number;
  constructor() {
    this.a = 1
  }
}

class Bar extends Foo {
  b: number;
  constructor() {
    super()
    this.b = 2
  }
}

const bar = new Bar()

getProperty(bar, 'a')
getProperty(bar, 'b')
getProperty(bar, 'c') // 报错