`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
}
对于两个函数(handleEntityGroup
和 fetchEntityGroup
)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>
目标是在我的 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
}
对于两个函数(handleEntityGroup
和 fetchEntityGroup
)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>