打字稿中的装饰器语法

时间:2020-09-05 16:48:14

标签: javascript typescript decorator

我不太了解有关下一个代码的大部分信息(来自打字稿手册):

RUN echo 'http://dl-cdn.alpinelinux.org/alpine/v3.6/main' >> /etc/apk/repositories
RUN echo 'http://dl-cdn.alpinelinux.org/alpine/v3.6/community' >> /etc/apk/repositories

RUN apk update
RUN apk add mongodb=3.4.4-r0

VOLUME ["/data/db"]
WORKDIR /data
EXPOSE 27017

为什么在function classDecorator<T extends { new (...args: any[]): {} }>( constructor: T ) { return class extends constructor { newProperty = "new property"; hello = "override"; }; } @classDecorator class Greeter { property = "property"; hello: string; constructor(m: string) { this.hello = m; } } console.log(new Greeter("world")); 中,<T extends { new (...args: any[]): {} }>扩展了一个“对象”? T到底扩展了什么?

为什么该函数返回一个扩展构造函数的类?我很困惑,我试图理解那两天。谢谢。

1 个答案:

答案 0 :(得分:1)

在JavaScript中,class 的构造函数,也就是说,类是可以new的对象。

在类定义中定义构造函数的语法实际上不是在定义类的成员,它只是一种指定参数以及(可选)以组织方式执行一些初始化的方式。

new关键字比ES2015 class语法早了大约二十年,之后才引入了“类”的名字

function Greeter(m: string) { }

并使用new Greeter("hi")实例化。

也就是说,您编写了一个构造函数,这就是一个类,现在基本上仍然是。

在ES2015中添加class语法后,它在很大程度上被设计为现有构造函数功能模式的更具声明性的语法糖。

现在,在这种情况下,我们可以解决您的问题。

T的约束表明它必须是构造函数,可以new进行编译,并且是class

这种类型可以用TypeScript编写几种方式

如示例中所示:

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

描述了一个可以用new调用,传递零个或多个参数的对象,它是一个类,并且是一个构造函数。

为澄清起见,将其与无需new即可调用的对象类型进行比较

{ (...args: any[]): {} }

上面描述了一个无需new就可以调用,传递零个或多个参数的对象,它是一个函数。

在现代TypeScript中,通常首选替代语法,因为它更简洁,更具表现力

new (...args: any[]) => {}

对于类/构造函数和

(...args: any[]) => {}

有关功能。

关于装饰器的返回值,它利用类装饰器的功能来用另一个类替换该类本身。类装饰器可以修改其目标,或者在我们返回新类的情况下,将其替换。