如何指定我的参数将是一个对象

时间:2018-05-04 09:02:08

标签: typescript

我需要告诉我的函数entityobject(任何对象):

但如果我这样做:

export function processEntityTags(entity: object) {
    entity.label;
}

它说property label doesn't exists on type object

entity变量可以有不同的属性,因此我无法实现entity Interface

所以我的问题是,我如何告诉我的程序实体将是任何类型的对象?

2 个答案:

答案 0 :(得分:1)

您可以使用索引签名定义具有类型any的值的接口。

interface Itest{
  [key: string]: any;
}

然后将接口作为参数的类型传递。这样,该函数只接受{}作为输入参数,如下所示

export function processEntityTags(entity: Itest) {
      entity.label;
}

const t = processEntityTags({label:5}); // no error

const t = processEntityTags(6);// error

工作演示:Playground

答案 1 :(得分:0)

虽然其他答案已经下去了创建一个接口的路径,该接口可能将任何属性定义为任何类型,但这样做会破坏使用打字稿的目的。

您说实体可能具有不同的属性,因此单个界面不起作用。每种类型的实体都必须具有一些共享属性,以允许它们传递到同一个函数中,以便您可以使用interface inheritance来正确键入它。

// Create a basic interface that has the label property
interface TaggableEntity{
  label: string
}

// Extend the taggable interface
interface TypeAEntity extends TaggableEntity{
  typea: string;
}

interface TypeBEntity extends TaggableEntity{
  typeb: string;
}

// Accept a Taggable Entity
function processEntityTags(entity: TaggableEntity) {
  entity.label; // Fine
  entity.typea; // Not Fine, `typea` does not exist on `TaggableEntity`
}

const typea: TypeAEntity = {
  typea: 'foo';
}

const typeb: TypeBEntity = {
  typeb: 'bar';
} 

// Although of different types both types inherit from the type accepted by the function.
processEntityTags(typea);
processEntityTags(typeb);

playground