Typescript:公共对象中的私钥

问题描述 投票:0回答:2

是否可以在公共对象中添加私钥?

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}`;
    }
}
typescript class object private public
2个回答
0
投票

为什么不只是

export class user {

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

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

0
投票

我不确定为什么要这么做(并且如果您确实想要类似private的行为,而不是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类型,其中detailsPrivateUser属性是PrivateDetails。这些类型和值不会导出。我们导出的是User类*和Details类型,其中detailsUser属性是Details。 (*请注意,我们实际上正在导出typeconst,它们都命名为Usertype对应于User实例的类型,const是构造函数。class ]定义会自动执行此操作,但是我们必须在此处两行执行。]

好的,让我们使用它:

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

我以您想要的方式运作。从内部LibraryPrivateUser类可以完全访问其details.username属性。但是从外部来看,暴露的User类则没有。这意味着如果您尝试使用它将出现编译器错误。当然,在运行时访问将成功,但是private属性也将以这种方式工作,所以我认为可以。

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

Link to code

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.