代码之家  ›  专栏  ›  技术社区  ›  Chris

typescript使用类/接口从对象中删除属性

  •  -1
  • Chris  · 技术社区  · 6 年前

    我有以下物品:

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

    interface PublicUserData {
        name: string
        gender: string
    }
    

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

    我知道我必须使用reflect元数据来获取这些信息,但是我现在需要一些提示来指引我正确的方向

    2 回复  |  直到 6 年前
        1
  •  1
  •   Jesse Carter    6 年前

    这可以通过使用decorators和reflect元数据来实现(正如您已经注意到的那样),但重要的是要理解t s接口不是JS语言特性,因此不提供反射能力。它们在运行时被完全删除。你必须用实际的类来实现它。

    对于您来说,只存储与您关心的对象属性相对应的字符串数组并使用object.keys方法系列删除不需要的内容可能会更容易。

        2
  •  0
  •   Codd Wrench    6 年前

    通过接口,它将无法工作,但您可以执行以下操作:

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

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