使用 "non-string keys" 访问对象值并将所有值定义为具有特定类型

Access object values using "non-string keys" and define all as having a certain type

没什么大不了的,但我想知道是否可以使用非字符串键访问一个对象,并定义它 return 与访问的任何类型相同。我可以弄清楚如何分别做这两件事,或者 "laboriously" 可以一起做。

我想我想要这样的东西:

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

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

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

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

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

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

DEFINITIONS['v1']

可以使用非字符串键访问 DEFINITIONS 但不能定义 return 类型:

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 等密钥进行访问的正确技术术语是什么。

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

p.s. I don't know what the correct technical terms for access using keys like ['v1'] or v1 is.

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