函数由类创建的类是什么类型?

时间:2019-01-24 18:00:59

标签: typescript decorator code-splitting first-class

目标是在我的TypeScript代码中进行代码拆分。

我使用(实验性)装饰器来支持从模型到持久性存储的类ORM数据映射。 一种类型需要使装饰器的参数化为表名,该表将存储该类型的实体。 为了进行代码拆分,我已经将域模型提取到单独的文件(entity-model.ts)中:

/* I am using dynamodb-data-mapper */
import { 
  table,
  hashKey,
  attribute
} from '@aws/dynamodb-data-mapper-annotations'

export class Entity {
  /* attributes */
}

/* this entity is parameterized with name of the table
   where data will be stored */
export function entityGroupClassFactory(tableName: string)/*: ???*/ {
  @table(tableName)
  class EntityGroup {
    @hashKey()
    id: string,

    @attribute({ memberType: embed(Entity) })
    children: Entity[]

  }
  return Entity
}

当我通过以下方式使用此文件时:

import { entityGroupClassFactory, Entity } from './entity-model.ts'
import { DataMapper } from '@aws/dynamodb-data-mapper';

const mapper : DataMapper = createDataMapper()
const tableName : string = deterineTableName()

const EntityGroup = entityGroupClassFactory(tableName)

/* eventually I do */

let entityGroup = mapper.get(/*...*/)

/* and at some point I am trying to do this: */

function handleEntityGroup(entityGroup: EntityGroup) {
  /* ... */
}

/* or this: */

async function fetchEntityGroup(): Promise<EntityGroup> {
  const entityGroup = /* ... */
  return entityGroup
}

对于这两个函数(handleEntityGroupfetchEntityGroup),TypeScript报告以下错误:

[ts] Cannot find name 'EntityGroup'. [2304]

我不确定这种方法的正确性,我会寻找其他方法来进行代码拆分。但是,作为该领域的初学者,我想回答以下问题:示例代码中的EntityGroup是什么?

谢谢。

1 个答案:

答案 0 :(得分:1)

声明类时,您会同时获得一个值(代表类构造函数)和一个类型(代表类的实例类型)。

使用函数返回类并将其放在const中时,基本上只获取该值,因此无需创建实例类型。

幸运的是,您可以使用InstanceType<typeof EntityGroup>来获取与构造函数EntityGroup关联的实例类型。

const EntityGroup = entityGroupClassFactory(tableName)
type EntityGroup = InstanceType<typeof EntityGroup>