【问题标题】:Access object values using "non-string keys" and define all as having a certain type使用“非字符串键”访问对象值并将所有对象定义为具有某种类型
【发布时间】:2016-02-08 08:16:50
【问题描述】:

没什么大不了的,但我想知道是否可以使用非字符串键访问对象并定义无论访问什么它都会返回相同的类型。我可以弄清楚如何分别做这两件事,或者可以“费力地”一起做。

我想我想要类似的东西:

var DEFINITIONS: {[key: 'non-string']: Definition} = { ... }

var DEFINITIONS: {[any]: Definition} = { ... }

我猜这个语法不存在(还没有?;))。

定义对象DEFINITIONS的返回类型,但必须使用字符串键访问:

interface Definition {
    id: number;
    type: string;
}

var DEFINITIONS: {[key: string]: Definition} = {
    v1: {
        id: 4,
        type: 'abc'
    }
}

DEFINITIONS['v1']

可以使用非字符串键访问DEFINITIONS,但不定义返回类型:

interface Definition {
    id: number;
    type: string;
}

var DEFINITIONS = {
    v1: {
        id: 4,
        type: 'abc'
    }
}

DEFINITIONS.v1  // Rightly does not show as having interface of `Definition`

或费力:

interface Definition {
    id: number;
    type: string;
}

var DEFINITIONS: {v1: Definition, v2: Definition, v3: Definition, etc...} = {
    v1: {
        id: 4,
        type: 'abc'
    },
    v2: { ... },
    v3: { ... },
    etc ...
}

DEFINITIONS.v1   // Great! Has explicit interface of Definition

// or:

var v1: Definition = {id: 4, type: 'abc'};
var DEFINITIONS2 = {v1};

附言我不知道使用 ['v1']v1 之类的密钥进行访问的正确技术术语是什么。

【问题讨论】:

    标签: object typescript key


    【解决方案1】:

    类型的索引器属性将对象建立为哈希映射。有意地,这意味着您只能使用方括号表示法来访问属性。这通常对可读性来说是一件好事,因为这意味着使用 Object 创建的哈希映射与其他非动态对象之间存在明显的语法差异。但是,还有一个open enhancement request 可以满足您的要求。

    附言我不知道使用 ['v1'] 或 v1 等键进行访问的正确技术术语是什么。

    EcmaScript 规范将它们分别称为“括号表示法”和“点表示法”;通俗地说,它们通常被称为“数组访问器”和“点访问器”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多