typescript 如果< T>是类/构造函数的类型,那么为什么我们需要在这里将其扩展为对象?

kr98yfug  于 2022-12-14  发布在  TypeScript
关注(0)|答案(1)|浏览(100)

如果<T>是一个类/构造函数的类型,那么为什么我们需要将其扩展到这里的一个对象?以及我们正在扩展的对象是如何接收参数的?有人能解释一下Decorator函数中发生了什么吗

interface MapLocation {
  lat: number;
  long: number;
}
        
function AddLocation(lat: number, long: number) {
  return <T extends { new (...args: any[]): {} }>(
    classConstructor: T
  ) => {
    return class extends classConstructor {
      public mapLocation: MapLocation;
      constructor(...args: any[]) {
        super(...args);
        this.mapLocation = { lat, long };
        }
     };
  };
}
    
@AddLocation(1.234, 1.876)
class Person {
  constructor(public name: string, public age: number) {}
}
t98cgbkg

t98cgbkg1#

T extends { new (...args: any[]): {} }

表示T应该是建构函式
它可以写得更简单

T extends new(...a:any[])=>any

装饰器基本上是一个函数,它允许禁止在非构造器上运行

AddLocation(1, 2)( {} ) // error
class X{
   @AddLocation(1, 2) // error
   f(){}
   @AddLocation(1, 2) // error
   val = 123;
}

构造函数将其参数作为参数列表传递

function getArgs(...a: any[]) { return a }
let a = getArgs(1, 2, 3) // [1, 2, 3]
console.log(...a) // 1 2 3

相关问题