【问题标题】:Is there a way to escape and use reserved words in TypeScript class definitions?有没有办法在 TypeScript 类定义中转义和使用保留字?
【发布时间】: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”之类的保留字,还是我必须去更改节点?

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

【问题讨论】:

    标签: javascript typescript firebase firebase-realtime-database escaping


    【解决方案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”的节点,如果我在同名的构造函数中创建一个属性,我可以抓住整个东西并将其用作类并获得丰富的智能感知等。 .. 目前我的解决方案是将“私有”节点更改为“关闭”,现在一切正常,但需要大量重构和手动数据库更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 2023-01-26
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    相关资源
    最近更新 更多