您可以拥有仅包含一些已知值的Typescript接口吗?

时间:2019-03-30 00:04:27

标签: typescript typescript-typings typescript-generics

我有一个动态的对象,我知道它将始终具有某些属性,但也将具有其他一些属性。

{
   id: number,
   name: string,
   ... // some dynamic stuff
}

有没有一种表达方式,以便对象仍然可以在已知属性上获得IntelliSense,但可以使用其他一些东西。

我对Typescript还是很陌生,所以很抱歉这是一个菜鸟问题。

1 个答案:

答案 0 :(得分:3)

按照@jcalz的建议,对此我所知道的最好是索引签名:

interface Foo {
  id: number;
  name: string;
  [prop: string]: any;
}

这将允许向具有idnumber的对象添加任何内容,并且符合Foo接口:

const f: Foo =  {
  id: 1,
  name: 'bar',
  zoo: 'keeper',
  something: new Map<string, symbol>(),
}; // no compile errors here

您还可以稍后添加属性:

foo.anything = 'value';

但是,tsc仍将请求idname。以下声明:

const f: Foo =  {
  id: 1,
  zoo: 'keeper',
  something: new Map<string, symbol>(),
}

会产生:

  

输入“ {{id:number;动物园:字符串;东西:地图; }”不可分配给“ Foo”类型。     类型“ {{id:number;”中缺少属性“名称”动物园:字符串;东西:地图; }'


如果您不知道要添加多少个道具,但又碰巧知道所有道具的通用类型,则可以缩小一些范围:

interface Poem {
  author: Author,
  language: string,
  [verses: string]: string;
}