使用“非字符串键”访问对象值,并将所有值定义为具有某种类型

时间:2016-02-08 08:16:50

标签: object typescript key

不是什么大不了但我想知道是否可以使用非字符串键访问对象并定义它将返回相同类型的任何访问。我可以弄清楚如何单独做两件事,或者可以“费力地”同时做两件事。

我想我想要这样的东西:

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};

P.S。我不知道使用['v1']v1等密钥访问的正确技术术语是什么。

1 个答案:

答案 0 :(得分:1)

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

  

P.S。我不知道使用['v1']或v1等键访问的正确技术术语是什么。

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