打字稿:public 对象中的私钥
Typescript: Private key in public object
有没有办法在 public 对象中添加私钥?
export class user {
public details: {
lastname: string,
firstname: string,
username: string
}
}
我希望不能在 class 中的方法之外设置用户名。
例如,类似的东西:
export class user {
public details: {
lastname: string,
firstname: string,
private _username: string
}
public setUsername() {
this.details._username = `${lastname} ${firstname}`;
}
}
为什么不只是
export class user {
public lastname: string,
public firstname: string,
private _username: string
public setUsername() {
this._username = `${this.lastname} ${this.firstname}`;
}
}
我不确定你为什么想要这个(如果你真的想要 private
-like 行为而不只是 readonly
),但我建议在这种情况下你把你的 classes 到一个模块中,你只导出预期的 public-facing 类型。类似于以下内容:
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
class和一个PrivateDetails
类型,其中PrivateUser
的details
属性是一个PrivateDetails
。这些类型和值不会导出。我们导出的是一个User
class*和一个Details
类型,其中User
的details
属性是一个Details
. (*请注意,我们实际上导出了一个 type
和一个 const
,都命名为 User
。type
对应于 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
这是我认为您想要的方式。从内部 Library
,PrivateUser
class 可以完全访问其 details.username
属性。但是从外面看,暴露的 User
class 没有。这意味着如果您尝试使用它,您将遇到编译器错误。当然在运行时访问会成功,但是 private
属性也可以这样工作,所以我认为没关系。
好的,希望对您有所帮助;祝你好运!
有没有办法在 public 对象中添加私钥?
export class user {
public details: {
lastname: string,
firstname: string,
username: string
}
}
我希望不能在 class 中的方法之外设置用户名。 例如,类似的东西:
export class user {
public details: {
lastname: string,
firstname: string,
private _username: string
}
public setUsername() {
this.details._username = `${lastname} ${firstname}`;
}
}
为什么不只是
export class user {
public lastname: string,
public firstname: string,
private _username: string
public setUsername() {
this._username = `${this.lastname} ${this.firstname}`;
}
}
我不确定你为什么想要这个(如果你真的想要 private
-like 行为而不只是 readonly
),但我建议在这种情况下你把你的 classes 到一个模块中,你只导出预期的 public-facing 类型。类似于以下内容:
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
class和一个PrivateDetails
类型,其中PrivateUser
的details
属性是一个PrivateDetails
。这些类型和值不会导出。我们导出的是一个User
class*和一个Details
类型,其中User
的details
属性是一个Details
. (*请注意,我们实际上导出了一个 type
和一个 const
,都命名为 User
。type
对应于 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
这是我认为您想要的方式。从内部 Library
,PrivateUser
class 可以完全访问其 details.username
属性。但是从外面看,暴露的 User
class 没有。这意味着如果您尝试使用它,您将遇到编译器错误。当然在运行时访问会成功,但是 private
属性也可以这样工作,所以我认为没关系。
好的,希望对您有所帮助;祝你好运!