【问题标题】:Typescript: Private key in public object打字稿:公共对象中的私钥
【发布时间】:2020-01-27 22:05:00
【问题描述】:

有没有办法在公共对象中添加私钥?

export class user {
    public details: {
        lastname: string,
        firstname: string,
        username: string
    }
}

我希望用户名不能设置在类中的方法之外。 例如,类似的东西:

export class user {
    public details: {
        lastname: string,
        firstname: string,
        private _username: string
    }

    public setUsername() {
        this.details._username = `${lastname} ${firstname}`;
    }
}

【问题讨论】:

  • “可以设置”,听起来你希望它是 readonly,而不是 private。或者你的意思是你不希望课外的人也能够阅读 username

标签: typescript class object private public


【解决方案1】:

为什么不直接

export class user {

    public lastname: string,
    public firstname: string,
    private _username: string

    public setUsername() {
        this._username = `${this.lastname} ${this.firstname}`;
    }
}

【讨论】:

    【解决方案2】:

    我不知道你为什么想要这个(如果你真的想要private-like 行为而不是readonly),但我建议在这种情况下你把你的类放到一个模块中您只导出预期的面向公众的类型。类似于以下内容:

    namespace Library {
      export interface Details {
        lastname: string;
        firstname: string;
      }
      interface PrivateDetails extends Details {
        username: string;
      }
      class PrivateUser {
        details: PrivateDetails;
        constructor(lastname: string, firstname: string) {
          this.details = { lastname, firstname, username: "" };
          this.setUsername(); // I guess?
        }
        setUsername() {
          this.details.username = `${this.details.lastname} ${
            this.details.firstname
          }`;
        }
      }
      export type User = Omit<PrivateUser, "details"> & {
        details: Details;
      };
      export const User: new (
        ...args: ConstructorParameters<typeof PrivateUser>
      ) => User = PrivateUser;
    }
    

    所以在库内部有一个PrivateUser 类和一个PrivateDetails 类型,其中PrivateUserdetails 属性是一个PrivateDetails。这些类型和值不会被导出。我们导出的是User 类* 和Details 类型,其中Userdetails 属性是Details。 (*请注意,我们实际上导出了一个type 和一个const,它们都命名为Usertype 对应于User 实例的类型,const 是构造函数。@987654341 @definition 会自动执行此操作,但我们必须在此处分两行执行此操作)。

    好的,让我们使用它:

    import User = Library.User;
    const u = new User("Turing", "Alan");
    console.log(u.details.firstname); // Turing
    console.log(u.details.lastname); // Alan
    console.log(u.details.username); // error!
    // Property 'username' does not exist on type 'Details'.
    // of course, at runtime, it still outputs "Turing Alan", just like a private property does
    u.details.lastname = "Alda";
    u.setUsername(); // okay
    console.log(u.details.username); // still compiler error, outputs "Alda Alan" at runtime
    

    这可以按照我的想法进行。在Library 内部,PrivateUser 类可以完全访问其details.username 属性。但从外部看,暴露的User 类没有。这意味着如果您尝试使用它,您将收到编译器错误。当然,在运行时访问会成功,但private 属性也可以这样工作,所以我认为没关系。

    好的,希望对您有所帮助;祝你好运!

    Link to code

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-28
      • 2016-10-29
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      相关资源
      最近更新 更多