打字稿:公共对象中的私钥

Jo-zTk

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

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}`;
    }
}
杰卡兹

我不确定你为什么想要这个(如果你真的想要private-like 行为而不是 just 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类型,其中的details属性PrivateUser是 a PrivateDetails不会导出这些类型和值。我们导出的是一个User类*和一个Details类型,其中的details属性User是 a Details(*注意,我们实际上导出了 atype和 a 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

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

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

代码链接

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

2 ArrayList中的公共对象

来自分类Dev

在Excel-VBA中创建公共对象的最佳实践?

来自分类Dev

了解打字稿类中的“公共” /“私人”

来自分类Dev

打字稿中的对象长度?

来自分类Dev

打字稿中的对象相等

来自分类Dev

打字稿中的对象类型

来自分类Dev

打字稿中的复合对象

来自分类Dev

打字稿中的复杂对象

来自分类Dev

打字稿-无法更新对象中的对象

来自分类Dev

实例化方法内部的公共对象

来自分类Dev

按对象 ID 在多个数组中查找公共对象

来自分类Dev

使用构造访问面向对象的 php 中的公共对象

来自分类Dev

打字稿构造函数中的公共vs私人

来自分类Dev

VBA:用户定义的类型作为公共对象模块中的事件参数

来自分类Dev

通过Angular.js中的公共对象属性过滤数组?

来自分类Dev

将公共对象添加到一个数组中并删除重复项

来自分类Dev

来自父类的公共对象在子类 xaml 中为空

来自分类Dev

从 js 数组中删除公共对象并创建新的 js 数组

来自分类Dev

打字稿定义中的可扩展对象

来自分类Dev

在打字稿中声明对象类型

来自分类Dev

遍历打字稿中的对象数组

来自分类Dev

在打字稿中映射对象类型

来自分类Dev

打字稿定义中的可扩展对象

来自分类Dev

无法在打字稿中创建对象

来自分类Dev

打字稿对象中的不同数组

来自分类Dev

VBA中只能将在公共对象模块中定义的公共用户定义类型用作参数

来自分类Dev

删除两个向量中的公共对象/获取向量中的重复对象(不擦除)

来自分类Dev

打字稿数组或对象

来自分类Dev

打字稿对象转换