Используя Mon goose и Typescript, какой тип следует использовать для поля ref интерфейса? - PullRequest
0 голосов
/ 30 марта 2020

Я использую mon goose и Typescript, и я хочу знать, какой тип или типы я должен использовать для ссылочного поля при создании интерфейса? Рассмотрим следующие два взаимосвязанных интерфейса:

interface ICat {
  name: string,
  colour: string,
}

interface ICatDB extends ICat, Document {};

interface IMouse {
  name: string,
  colour: string,
  chasedBy: /* ... */
}

interface IMouseDB extends IMouse, Document {};

и схемы и модели, которые их используют:

let cat = new Schema({
  name: String,
  colour: String,
});

mongoose.model<ICatDB>('Cat', cat);
let mouse = new Schema({
  name: String,
  colour: String,
  chasedBy: { type: Schema.Types.ObjectId, ref: 'Cat' }
});

mongoose.model<IMouseDB>('Mouse', mouse);

Для поля chasedBy нам необходимо рассмотреть что он может принимать значения в трех формах:

  • String или ObjectId при передаче в метод create()
  • ObjectId при возврате из Mon goose
  • Экземпляр ICat при возврате из пн goose с использованием populate()

Есть ли способ указать типы, которые может поддерживать интерфейс, без необходимости прибегая к использованию any?

Кстати, мы разделили IMouse и IMouseDB, так как Typescript хотел, чтобы все поля для Document заполнялись каждый раз, когда мы создавали новый объект IMouse, так что это было работа вокруг.

1 Ответ

0 голосов
/ 01 апреля 2020

Не имея альтернативного ответа, я выбрал:

import { ObjectID } from 'mongodb';
import ICat from './ICat';

interface IMouse {
  name: string,
  colour: string,
  chasedBy: string | ObjectID | ICat
}

Здесь описаны варианты типа для свойства chasedBy. Относительно того, является ли это рекомендуемым подходом, я не могу сказать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...