目标是在我的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
}
对于这两个函数(handleEntityGroup
和fetchEntityGroup
),TypeScript报告以下错误:
[ts] Cannot find name 'EntityGroup'. [2304]
我不确定这种方法的正确性,我会寻找其他方法来进行代码拆分。但是,作为该领域的初学者,我想回答以下问题:示例代码中的EntityGroup
是什么?
谢谢。
答案 0 :(得分:1)
声明类时,您会同时获得一个值(代表类构造函数)和一个类型(代表类的实例类型)。
使用函数返回类并将其放在const
中时,基本上只获取该值,因此无需创建实例类型。
幸运的是,您可以使用InstanceType<typeof EntityGroup>
来获取与构造函数EntityGroup
关联的实例类型。
const EntityGroup = entityGroupClassFactory(tableName)
type EntityGroup = InstanceType<typeof EntityGroup>