如果定义索引器,所有属性都必须符合接口的返回类型。您可以执行以下操作:
export interface Aggr {
[name: string]: AggrEntry |Aggr;
filter?: Aggr;
}
这显然不理想,因为这允许除filter
属于类型Aggr
.
另一种选择是使用type
定义而不是接口,并使用交集类型:
export type Aggr = {
[name: string]: AggrEntry;
} & {
filter?: Aggr;
}
let test : Aggr;
let foo = test.foo // foo is AggrEntry
test.filter // works, is of type Aggr
虽然我们可以按预期访问对象字段,但创建这种类型的对象有点棘手。使用以下命令创建对象字面量filter
字段将产生与原始错误类似的错误。我们可以使用 Object.assign 使用对象文字创建该类型的实例:
let test : Aggr = Object.assign({
foo: new AggrEntry()
}, {
filter: {
bar: new AggrEntry()
}
});
或者我们可以创建一个专用函数来帮助创建,它使用Object.assign
:
function createAggr(dynamicPart: {
[name: string]: AggrEntry;
}, staticPart?: {
filter?: Aggr;
}) {
return Object.assign(dynamicPart, staticPart);
}
let test : Aggr = createAggr({
foo: new AggrEntry()
}, {
filter: {
bar: new AggrEntry()
}
});