Какой тип имеет `class`, созданный функцией`? - PullRequest
0 голосов
/ 24 января 2019

Цель - , чтобы выполнить разбиение кода в моем коде 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 Ответ

0 голосов
/ 24 января 2019

Когда вы объявляете класс, вы получаете как значение (представляющее конструктор класса), так и тип (представляющий тип экземпляра класса) с именем класса.

Когда вы используете функцию для возврата класса и помещаете его в const, вы в основном получаете только значение, у типа экземпляра нет причин для создания.

К счастью, вы можете использовать InstanceType<typeof EntityGroup>, чтобы получить тип экземпляра, связанный с конструктором EntityGroup.

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