簡體   English   中英

Typescript:公鑰中的私鑰 object

[英]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類型,其中PrivateDetailsdetails屬性是一個PrivateUser 這些類型和值不會被導出。 我們導出的是一個User類* 和一個Details類型,其中Userdetails屬性是一個Details (*請注意,我們實際上導出了一個type和一個const ,兩者都命名為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

這適用於我認為你想要的方式。 在內部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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM