如果 value1 不是有效的 属性,'return object[value1][value2] || default' 将失败

'return object[value1][value2] || default' fails if value1 is not a valid property

我有一个对象字面量,其方法是 return 给定特定输入的子 属性,或者如果查找失败,则 return 默认 属性。

//private class, no export
class TemplateSelection {
  'bills';
  'legislators';
}

export class ComponentTemplates {
  private readonly 'notFound';
  private readonly 'data': {
    'us': TemplateSelection,
    'ny': TemplateSelection,
  }

  constructor(){
    this.notFound = PageNotFoundComponent;

    this.data = {
      us: { bills: BillDataComponent, legislators: UsComponent },
      ny: { bills: BillDataComponent, legislators: NyComponent },
    }
  }

  public getData = (requested: RouteParameters) => {
    // TODO: lookup fails if !requested.region, but not if !requested.resourceType?
    return this.data[requested.region][requested.resourceType] || this.notFound;
  }
}
  1. 如果 [requested.region] == 'us' & [requested.resourceType] == 'bills',我得到 BillDataComponent 组件,正如预期的那样。
  2. 如果 [requested.region] == 'ny'[requested.resourceType] == 'monkeys',我会按预期获得 PageNotFoundComponent。
  3. 如果 [requested.region] == 'monkeys'[requested.resourceType] == 'legislators',我在我的项目中得到 TypeError: Cannot read property 'legislators' of undefined

|| 比较似乎只查看最后一个查找键而不是两者,但括号、大括号或圆括号的任何组合似乎都没有将该比较扩展到整个 this.data[requested.region][requested.resourceType].

我错过了什么?

对于那里的任何其他新手,如@Nit , JavaScript doesn't currently support so-called "Optional Chaining";(遗憾的是非常难看)"solution" 是在第一个 if/else 检查中回避问题参数,像这样:

  public getData = (requested: RouteParameters) => {
    if (this.regions.includes(requested.region))
      return this.components[requested.region][requested.resourceType] || this.notFound;
    else return this.notFound;
  }