`function` 创建的 `class` 是什么类型?

What type has the `class` created by a `function`?

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

我使用(实验性的)装饰器来支持从模型到持久存储的类似 ORM 的数据映射。 其中一种类型需要一个装饰器参数化,名称为 table ,它将存储该类型的实体。 为了进行代码拆分,我将领域模型提取到一个单独的文件中 (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 是什么?

谢谢。

当你声明一个 class 时,你会得到一个值(代表 class 构造函数)和一个类型(代表 class 的实例类型)与 class名字.

当你使用一个函数来return一个class,并把它放在const你基本上只是得到值,实例类型没有理由创建。

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

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