我是做 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}`;
}
}