请考虑以下几点:
class X {
bar() {
return "bar"
}
constructor(private readonly x: number){}
}
interface Y extends X {
}
const f = (y: Y) => { console.log(y.bar()); }
f({ bar: () => "tavern"});它不编译,因为缺少x。
f({ bar: () => "tavern", x: 1});不编译,因为x不是私有的。
重写代码,这样就可以声明x私有
class Y implements X {
bar() {
return "tavern"
}
private x = 1;
}因为“类型有单独的声明”而被拒绝。
我找到的唯一解决方案是从构造函数中删除private。
我真正想做的是第一件事:我不关心类的私有属性,尤其不关心构造函数中声明的私有成员。
我的两个问题是:
发布于 2019-10-09 19:14:43
Ryan,微软打字组的开发负责人,写:
允许私有字段丢失将是一个巨大的问题,而不是一些琐碎的可靠问题。 请考虑以下代码: 类标识{私有id: string =“秘密代理”;公共sameAs(其他:标识){返回this.id.toLowerCase() === other.id.toLowerCase();}类MockIdentity实现标识{公共sameAs(其他:标识){返回false;}}
MockIdentity是一个与公共兼容的Identity版本,但是当一个非模拟的副本与一个模拟的副本交互时,试图将它作为一个公共版本在sameAs中崩溃。
这太糟糕了。这很有道理,但很糟糕。
但是我找到了一个解决我问题的方法:
type Public<T> = {
[P in keyof T]: T[P];
};
class X {
bar() {
return "bar"
}
constructor(private readonly x: number){}
}
interface Y extends Public<X> { }
const f = (y: Y) => { console.log(y.bar()); }
f({ bar: () => "tavern"});这允许我可靠地模拟复杂类型,而不必模拟私有数据。
这在测试上下文中是安全的,在测试上下文中,模拟实例和实际实例从不交互。
发布于 2019-10-09 18:31:23
接口不应该扩展类。接口定义对象的特征(接口可饮用),类定义对象是什么(类水)。因此,我建议您定义一个接口,并让您的类实现该接口。
https://stackoverflow.com/questions/58310111
复制相似问题