如何声明具有可变数量属性的 TypeScript 接口?

Ric*_*ham 2 typescript

这是一个简单的问题,令我惊讶的是我在任何地方都找不到明确的答案。我正在制作一个 API,我需要定义一个可以具有多个(字符串)属性的接口,但是没有固定数量的属性,也没有为它们设置名称(但它们都必须具有字符串值)。因此,以下所有对象都将匹配该类型:

{ slot: "ten" }

{ class: "Luxury", base: "never", city: "Timbuktu" }

{ slot: "ten", class: "Luxury" }
Run Code Online (Sandbox Code Playgroud)

我想到了以下几点。

interface MyInterface {
    [key: string]: string;
}
Run Code Online (Sandbox Code Playgroud)

但是对我来说,这表示对象只能具有一个属性(名称不同),而不是它们可以具有多个属性(名称不同)。

做到这一点的最佳方法是什么?请注意,我无法控制调用我的 API 的代码将使用哪些属性名称。调用者可以使用他们想要的任何属性名称。

ric*_*aan 6

interface可能看起来只接受一个必须为 type 的属性string,但这实际上是用于定义具有任意数量属性的接口的语法,这些属性都具有相同的特征(字符串作为键和字符串作为值)。这称为可索引类型(归功于@axiac,我不知道它有名字)。

因此,保持界面原样没有任何问题:

interface MyInterface {
    [key: string]: string;
}
Run Code Online (Sandbox Code Playgroud)

Typescript 带有一个名为Record的本机实用程序类型,它可以归结为相同的内容,但更简洁:

type MyInterface = Record<string, string>;
Run Code Online (Sandbox Code Playgroud)

功能上两者没有区别,选择哪一个就看个人喜好了。