如何在不将对象的每一个属性都添加到定义中的情况下定义对象的一般结构?

How can I define the general structure of an object without adding every single one of its properties to the definition?

假设我有一个如下所示的对象,将错误名称映射到它们的代码和消息:

let Errors = { FOO: [1, 'Foo error'], BAR: [2, 'Bar error'], BAZ: [3, 'Baz error'] }

每个 属性 都有 (number | string)[] 的推断类型,很好,但我们知道该类型实际上是更具体的 [number, string]。为了让 TypeScript 知道它,据我了解,我们必须执行以下操作:

let Errors = { FOO: [1, 'Foo error'] as [number, string], BAR: [2, 'Bar error'] as [number, string], BAZ: [3, 'Baz error'] as [number, string] }

是否有可能以更清晰的方式向所有属性添加正确的类型,从而避免所有这些重复?

无法告诉编译器所有属性都具有相同的类型。

您可以使用 type alias 使其变得更好:

type ErrorInfo = [number, string];

let Errors = {
    FOO: [1, 'Foo error'] as ErrorInfo,
    BAR: [2, 'Bar error'] as ErrorInfo,
    BAZ: [3, 'Baz error'] as ErrorInfo
};

另一种选择是为您的Errors:

设置一个类型
type ErrorInfo = [number, string];

interface ErrorMap = {
    FOO: ErrorInfo;
    BAR: ErrorInfo;
    BAZ: ErrorInfo;
}

let Errors: ErrorMap = {
    FOO: [1, 'Foo error'],
    BAR: [2, 'Bar error'],
    BAZ: [3, 'Baz error']
};

这里确实有重复,但它很好地区分了接口和实际运行时值。