【问题标题】:typescript use class/interface to delete properties from an object打字稿使用类/接口从对象中删除属性
【发布时间】:2019-02-10 13:30:29
【问题描述】:

我有以下对象:

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

和界面:

interface PublicUserData {
    name: string
    gender: string
}

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

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

【问题讨论】:

    标签: typescript reflection interface


    【解决方案1】:

    通过界面是不行的,但是你可以这样做:

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

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

    【讨论】:

      【解决方案2】:

      这可以通过使用装饰器和反射元数据来完成(正如您已经注意到的),但重要的是要了解 TS 接口不是 JS 语言功能,因此不提供反射能力。它们在运行时被完全擦除。您将不得不使用实际的类来实现它。

      您可能更容易只存储与您关心的对象属性相对应的字符串数组,并使用 Object.keys 系列方法删除您不想要的东西。

      【讨论】:

      猜你喜欢
      • 2017-10-27
      • 1970-01-01
      • 2018-07-14
      • 2019-06-30
      • 2018-09-10
      • 1970-01-01
      • 2019-04-18
      • 2017-06-29
      • 1970-01-01
      相关资源
      最近更新 更多