Какой тип имеет `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
}
Для обеих функций (handleEntityGroup
а также fetchEntityGroup
) TypeScript сообщает о следующей ошибке:
[ts] Cannot find name 'EntityGroup'. [2304]
Я не уверен в правильности такого подхода, и я буду искать другие варианты для разделения кода. Но, как новичок в этой области, я хотел бы получить ответ на вопрос: что такое EntityGroup
в этом примере кода?
Спасибо.
1 ответ
Когда вы объявляете класс, вы получаете как значение (представляющее конструктор класса), так и тип (представляющий тип экземпляра класса) с именем класса.
Когда вы используете функцию для возврата класса и помещаете его в const
вы в основном получаете только значение, у типа экземпляра нет причин для создания.
К счастью, вы можете использовать InstanceType<typeof EntityGroup>
чтобы получить тип экземпляра, связанный с конструктором EntityGroup
,
const EntityGroup = entityGroupClassFactory(tableName)
type EntityGroup = InstanceType<typeof EntityGroup>