【问题标题】:How to safely access object property with space (JSONP property like "First Name" : "...")如何使用空格安全地访问对象属性(JSONP 属性,如“First Name”:“...”)
【发布时间】:2016-05-16 19:48:52
【问题描述】:

如何注释这些对象,以便在我尝试访问不存在的属性时收到编译器错误或警告?

{
  "Id": 1
  "First Name": "Lorem",
  "Last Name": "Ipsum",
}

我已经使用这个定义注释了这个对象:

interface Person{
  Id: number;
  "First Name": string;
  "Last Name": string;
}

但是,我仍然无法安全地访问“名字”属性,因为访问它的唯一方法是:

var person : Person = ...;
var firstName = person["First Name"];

这不仅会返回任何值,而且还允许访问未定义的属性,例如 person['bla bla'] 而不会出现编译器错误。

【问题讨论】:

    标签: typescript jsdoc


    【解决方案1】:

    你有像"First Name"这样的索引吗?
    因为这就是导致问题的原因,请考虑以下代码:

    interface Person {
        Id: number;
        FirstName: string;
        LastName: string;
    }
    
    var person : Person = { Id: 3, FirstName: "fname", LastName: "lname" };
    var firstName = person.FirstName;
    var illegal = person.nothing; // error
    var legal = person["nothing"]; // ok
    

    (playground)

    当我尝试person.nothing 时,它抱怨接口Person 没有这个属性,但是当我尝试person["nothing"] 时它没有抱怨。

    【讨论】:

    • 是的,我必须使用这种格式,因为我不拥有这些数据。当我像我一样用引号注释对象时,打字稿会验证var person: Person = { ... }之类的分配
    • 是的,这种赋值会检查属性,就像您使用点表示法 (person.FirstName) 时一样。我不知道如何让编译器在您将其用作索引时验证属性名称 (person["First Name"]),但也许这里的其他人知道如何。
    猜你喜欢
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    • 2015-08-18
    相关资源
    最近更新 更多