有没有办法在 TypeScript 类定义中转义和使用保留字?

Posted

技术标签:

【中文标题】有没有办法在 TypeScript 类定义中转义和使用保留字?【英文标题】:Is there a way to escape and use reserved words in TypeScript class definitions? 【发布时间】:2017-08-24 18:21:03 【问题描述】:

这是我想做的一个简单示例:

export class UserInfoPrivate 
    constructor(
        public repEmail: string,
        public repPhone: string,
        public agreedToTnC: boolean
    )  


export class UserInfo 
    constructor(
        public $uid: string,
        public orgApproved: false,
        public private: UserInfoPrivate, // <-- private is a reserved word
        public open: UserInfoOpen,
    )  

由于数据库是 NoSQL (Firebase) 并返回简单的 JSON 结构化对象,并且我在名为“private”的用户下有一个节点,我想直接将我的类映射到它而不需要额外的解析。有没有办法在类定义中使用诸如“private”之类的保留字,还是我必须去更改节点?

到目前为止,我的研究似乎表明没有,但我很难接受这是不可能的。

【问题讨论】:

【参考方案1】:

您始终可以将属性名称(在类或对象文字中)放在引号中 - 对于那些不是有效标识符名称的名称,您需要这样做。然后,您可以使用bracket notation 访问它们。

export class UserInfo 
    public "private": UserInfoPrivate
    constructor(
        public $uid: string,
        public orgApproved: false,
        privateParam: UserInfoPrivate,
        public open: UserInfoOpen,
    ) 
        this.private = privateParam;
    

(我希望这不仅在我眼中而且在编译器看来都是有效的 Typescript)

【讨论】:

...只是不是 OP 想要的,在构造函数参数列表中(TypeScript 部分的奇怪遗漏)。另请注意,虽然您可以执行this["private"] = privateParam;,但您不必这样做; this.private = privateParam; 完全有效,并且自 ES5(2009 年 12 月)以来一直有效。 @T.J.Crowder 啊,对。我不必要地概括为根本没有标识符名称的字符串(例如包含空格)。确实,private 是一个有效的名称但不是一个有效的标识符,所以我们只能将它用作变量(或参数)名称。 @Bergi 您可以使用:public private: UserInfoPrivate。仅当您尝试使用 inline 与您的构造函数时,它才会失败。尝试从您的代码中删除",它仍然可以工作。 @Diullei 是的,我把它留在这里是为了说明您可以在需要时使用引号 感谢您的宝贵时间,但看起来您错过了关键问题。当我的对象来自数据库时,它有一个名为“private”的节点,如果我在同名的构造函数中创建一个属性,我可以抓住整个东西并将其用作类并获得丰富的智能感知等。 .. 目前我的解决方案是将“私有”节点更改为“关闭”,现在一切正常,但需要大量重构和手动数据库更新。

以上是关于有没有办法在 TypeScript 类定义中转义和使用保留字?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 xml 中转义 CDATA 结束令牌?

有没有办法在声明 angular2 数据模型时在 typescript 中引用数据类型

有没有办法通过 tslint 规则在 Typescript 类上强制执行方法返回类型?

有没有办法在 TypeScript 中动态应用数组映射器?

有没有办法在 TypeScript 中扩展同名的第三方库类型

JAVA中转义字元的疑问