我试图为我的界面Student创建一个扩展方法
declare global {
interface Student {
CourseOpted(): String;
}
}
Student.prototype.CourseOpted = function(): string {
return 'some-string';
}
export {};
当我把光标放在Student:-得到这个错误
'Student'只指向一个类型,但在这里被用作一个值。参考这篇文章:- https://www.c-sharpcorner.com/article/learn-about-extension-methods-in-typescript/#:~:text=Extension%2Dmethod%20gives%20you%20the,any%20data%2Dtype%20you%20want.
我可以注意到的是;-当我们扩展类的接口,如字符串,数字,数组..扩展方法是可能的。那么为什么不是上面的例子呢?请帮帮我!解决这个错误
提前感谢:)
编辑:-所以我们找到了这个扩展方法repo:- https://github.com/staeke/ts-extension-methods
interface
是一个编译时间元素。当你将Typescript编译成Javascript时,它不会为interface
发出任何东西。interface
只存在于编译时(有利于typescript)。
对于String, Number等有效的原因是因为它们在运行时存在。
如果你想要不同的函数实现
- 那么为什么不将
Student
声明为具有默认功能实现的class
,并允许子类在需要时覆盖功能实现。
如果你想静态实现
- 然后简单地将其声明为
Student
类中的静态函数
Student
是interface
,而不是class
,您应该在进行任何更改之前创建类并导入它。也许创建一个新类更好。如果您从服务器获取学生数据,您还可以向它添加序列化。
Typescript Playground Link
interface IStudent {
id: number;
firstName: string,
lastName: string,
}
class Student implements IStudent {
id: number;
firstName: string;
lastName: string;
constructor(student: IStudent)
constructor(id: number, firstName: string, lastName: string)
constructor(idOrStudent: number | IStudent, firstName?: string, lastName?: string) {
if (typeof idOrStudent === "object") {
this.id = idOrStudent.id;
this.firstName = idOrStudent.firstName;
this.lastName = idOrStudent.lastName;
return;
}
this.id = idOrStudent;
this.firstName = firstName as string;
this.lastName = lastName as string;
}
public foo() {
return "bar";
}
}
const student0 = new Student(0, "John", "Doe");
console.log(student0);
console.log(student0.foo());
const student1 = new Student({
id: 1,
firstName: "Milka",
lastName: "Helgi"
});
console.log(student1);