我有以下对象:
{
name: 'Jon',
gender: 'male',
secret: 'xxx'
}
和界面:
interface PublicUserData {
name: string
gender: string
}
我可以以某种方式迭代PublicUserData的所有属性,并从接口中不存在的其他对象中删除所有属性吗?
我知道我将必须使用reflect-metadata来获取该信息,但是现在我需要一些提示以指向正确的方向
答案 0 :(得分:1)
这可以通过使用装饰器和reflect-metadata(如您已经提到的)来完成,但重要的是要了解TS接口不是JS语言功能,因此不提供反射功能。它们在运行时被完全擦除。您将不得不使用实际的类来实现它。
仅存储与您关心的对象属性相对应的字符串数组并使用Object.keys系列方法删除不需要的内容可能会更容易。
答案 1 :(得分:0)
通过该界面将无法使用,但是您可以这样做:
interface IUserData{
name: string;
gender: string;
secret: string;
}
class PublicUserData {
name: string;
gender: string;
constructor(data: IUserData){
this.name = data.name;
this.gender = data.gender;
}
}
class UserData extends PublicUserData implements IUserData {
secret: string;
constructor(data: IUserData){
super(data);
this.secret = data.secret;
}
}
因此使用:
var data = {
name: 'Jon',
gender: 'male',
secret: 'xxx'
} as IUserData;
var publicUserData = new PublicUserData(data);
var userData = new UserData(data);
var publicUserData2 = new PublicUserData(userData);
结果:
publicUserData: {name: "Jon", gender: "male"}
publicUserData2:{name: "Jon", gender: "male"}
userData: {name: "Jon", gender: "male", secret: "xxx"}
当然可以通过转换类型使用装箱/拆箱机制看起来更好,但这不能隐藏属性。因此,有必要明确给出类型。