如何在索引接口中支持不同类型?

时间:2018-03-09 09:03:06

标签: typescript

在Typescript Document中有一个例子。

interface NumberDictionary {
    [index: string]: number;
    length: number;    // ok, length is a number
    name: string;      // error, the type of 'name' is not a subtype of the indexer
}

我明白为什么这是不正确的。 但有时我真的想要一个name: stringlength: number类型的对象。其他索引是number。如何编写接口来匹配跟随对象?

{
  name: 'Bill',
  length: 123,
  foo: 1,
  bar: 2,
  // .... blahblah
}

2 个答案:

答案 0 :(得分:2)

您可以使用交集类型定义这样的类型,但是您需要使用Object.assign来初始化它,对象文字将无法满足机器人索引和name

type NumberDictionary = { [index: string]: number; } & {
    length: number;
    name: string;
}

var dd: NumberDictionary = Object.assign({
    name: 'Bill',
    length: 123
}, {
    foo: 1,
    bar: 2,
});
let fc = dd["foo"] // number
let dName = dd.name; //string

答案 1 :(得分:0)

您可以使用交叉点类型。

type NumberDictionary = {
    [index: string]: number
} & {
    length: number,
    name: string,
}