什么是`const标签:{[foo:string]:string} =`,我能做得更好吗?

问题描述 投票:0回答:1

我是TypeScript的新手。我已经编写了一段类似于以下的代码,并且“行之有效”(我使用TypeScript 3.7编译了代码):

const something: { [foo: string]: string } =  <...> ;

我不想集中在=的右侧。 <...>是实际代码的占位符。

我想精确地理解:左侧的结构是什么?我们怎么称呼它?它由哪些部分组成(以及我们如何称呼这些部分),以及 它实际上提供了哪些保证?

我简要地认为{ [foo: string]: string }是一个匿名接口声明,但是在网上搜索此术语仅确认我最好know而不是think :-)。这把我带到这里。

我应该说我发现的东西。我查了一下TS规范。我发现{ [foo: string]: string }可能是Object Type Literal,其中内部部分(TypeBody)似乎是Index Signature。索引签名似乎由[ BindingIdentifier : string ] TypeAnnotation组成。我必须说,在阅读了3.9.4 Index Signatures节后,我还不清楚。特别是:在我的情况下,BindingIdentifierfoo的作用是什么?我发现所示代码中的foo确实可以是任何东西(可以使用keyxbar而不是foo进行编译和运行),而且我感到困惑,这是代码的味道。我是否可以不用foo而逃脱,即没有BindingIdentifier?我认为这最后一部分与https://github.com/Microsoft/TypeScript/issues/7803有关,但是该讨论尚未真正结束,已经过去了几年。

[其次,这是我的目的:我想用一个内联类型表达式声明变量something,这应该暗示该值必须是仅由string键和string值组成的对象。基于tsc的反馈,我认为我的尝试实现了这一目标。但是,确实是这样,有没有更清洁的方法来实现这一目标?

typescript
1个回答
1
投票

保证某些东西将是一个带有字符串键和字符串值(又不能是未定义的)的JavaScript对象(并且不能被未定义)。>>

我个人尝试尽量使内联文字保持稀疏,因此,通常我将其导出为单独的类型,例如

interface MySomething {
  [key: string]: string;
}

此外,由于这是一种常见的构造,因此我创建了唯一的全局类型,以便可以在任何地方本地使用此类型。它是Dict类型,看起来像这样:

// src/global.d.ts
declare interface Dict<T = any> {
  [key: string]: T;
}

这意味着在这种情况下,我可以简单地拥有...

const something: Dict<string> = <...>;

解决您的其他观点时,密钥的名称确实是任意的,但是我发现根据这样表示的方式,为密钥起一个合理的名称对它很有帮助,可以将其作为代码的文档形式任何使用该类型的人。

© www.soinside.com 2019 - 2024. All rights reserved.