我是做 Java 后端的,这两天正在系统化的学习 ts ,学到装饰器的时候,有点疑惑,希望可以指导下,谢谢大家。以下是 Demo
type COnstructor= new (...args: any[]) => {}; function LogTime<T extends Constructor>(target: T) { return class extends target { createTime: Date; constructor(...args: any[]) { super(...args); this.createTime = new Date(); } getCreateTime() { return `该对象的创建时间是:${this.createTime}`; } }; } @LogTime class Person { name: string; age: number; constructor(name: string, age: number) { this.name = name; this.age = age; } } interface Person { getCreateTime(): void; } const person = new Person("小明", 18); console.log(person.getCreateTime());
如果不声明 interface Person { getCreateTime(): void },那么 person.getCreateTime()会报错,提示 Person 对象中没有这个属性。加上这个接口就不会报错了,但有一个问题,接口中规范了 getCreateTime()函数的返回值为 void ,实际上装饰器中 getCreateTime()返回的是 string ,这不矛盾吗?我尝试修改接口中的 getCreateTime()函数的返回值,发现改成任意类型都可以...
现在给我的感觉就是,为了让 person.getCreateTime()代码不报错,就打了 interface Person 这个补丁,而且可以不强制遵循这个补丁的规范。
由此我想到了另一个问题,从上述代码看,Person 既是一个 class ,也是一个 interface ,我还可以创建一个新的 class 来 implements Person ,发现 class Person 中的所有属性也都要实现,所以 interface Person 是把 class Person 转成了接口?
class NewPerson implements Person { name: string; age: number; createTime: Date; constructor(name: string, age: number) { this.name = name; this.age = age; this.createTime = new Date(); } getCreateTime() { return `该对象的创建时间是:${this.createTime}`; } }