打字稿使用类/接口从对象中删除属性

时间:2018-09-05 11:53:36

标签: typescript reflection interface

我有以下对象:

{
   name: 'Jon',
   gender: 'male',
   secret: 'xxx'
}

和界面:

interface PublicUserData {
    name: string
    gender: string
}

我可以以某种方式迭代PublicUserData的所有属性,并从接口中不存在的其他对象中删除所有属性吗?

我知道我将必须使用reflect-metadata来获取该信息,但是现在我需要一些提示以指向正确的方向

2 个答案:

答案 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"}

当然可以通过转换类型使用装箱/拆箱机制看起来更好,但这不能隐藏属性。因此,有必要明确给出类型。