我正在使用具有大型界面的库
interface IOrder{
cutomerId: number;
deliveryAddress1: string;
// and lots of properties...
}
我想实现一个扩展它的类。
只想确认有必要重新声明所有属性。
class Order implements IOrder{
cutomerId: number;
/* error: Class 'Order' incorrectly implements interface 'IOrder'.
Property 'deliveryAddress1' is missing in type 'Order'
*/
}
当然,需要实现方法,但我发现重新声明属性是多余的。我错过了什么吗?
答案 0 :(得分:1)
是的,如果实现界面,则必须重新声明所有字段。您可以通过创建一个创建实现接口的类的函数来执行解决方法。该实现实际上不会添加任何代码或字段,如果接口仅包含它可用的字段,它只会声明它会这样做,尽管字段将保持未初始化,但如果它有方法则它们将取消定义:
function autoExtend<T>(): new () => T {
return class {} as any
}
class Order extends autoExtend<IOrder>() {
}
var cc = new Order();
cc.cutomerId = 0;
在typescript 2.8中,您还可以定义autoExtend
来删除方法,以避免使用方法的接口出现潜在错误:
type NonMethodKeys<T> = ({[P in keyof T]: T[P] extends Function ? never : P } & { [x: string]: never })[keyof T];
type RemoveMethods<T> = Pick<T, NonMethodKeys<T>>;
function autoExtend<T>(): new () => RemoveMethods< T> {
return class {} as any
}
class Order extends autoExtend<IOrder>() implements IOrder {
// Must define method
method(){
}
}
答案 1 :(得分:0)
您需要重新声明所有属性。因为接口绑定了实现类的属性
class Order implements IOrder{
cutomerId: number;
deliveryAddress1: string;
/*all properties of interface ...*/
}