[英]Typescript: Private key in public object
有沒有辦法在公共 object 中添加私鑰?
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}`;
}
}
我不確定你為什么想要這個(如果你真的想要類似private
的行為而不是readonly
),但我建議在這種情況下你將你的類放入一個模塊中,你只導出預期的 public-面對類型。 類似於以下內容:
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
類型,其中PrivateDetails
的details
屬性是一個PrivateUser
。 這些類型和值不會被導出。 我們導出的是一個User
類* 和一個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
屬性也可以這樣工作,所以我認為沒關系。
好的,希望有幫助; 祝你好運!
為什么不只是
export class user {
public lastname: string,
public firstname: string,
private _username: string
public setUsername() {
this._username = `${this.lastname} ${this.firstname}`;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.