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

时间:2016-10-05 17:38:09

标签: typescript types interface structure indexer

假设我有一个像下面这样的对象,将错误名称映射到他们的代码和消息:

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

是否可以以更干净的方式为所有属性添加适当的类型以避免所有这些重复?

1 个答案:

答案 0 :(得分:2)

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

您可以使用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']
};

这里有一个重复的重复,但它在界面和实际运行时值之间做了很好的分离。