Создание экземпляров типов пересечений

#typescript

Вопрос:

Я пытаюсь использовать библиотеку JS под названием Automerge. Библиотека содержит тип, объявленный следующим образом:

type BinaryDocument = Uint8Array amp; { __binaryDocument: true }

Обратите внимание, что __binaryDocument это литеральный тип true.

Как мне создать экземпляр такого типа красиво?

Я закончил с этим, что кажется излишним:

 class BinaryDocument extends Uint8Array {
  __binaryDocument: true

  constructor(val: Uint8Array) {
    super(val)
  }

  static from(buffer: Uint8Array): BinaryDocument {
    return new BinaryDocument(buffer)
  }
}
 

Комментарии:

1. Я недостаточно разбираюсь в «automerge», чтобы знать, что здесь происходит, но вы уверены, что вообще должны создавать экземпляры этого типа? Похоже __binaryDocument , это фантомное свойство, используемое для номинального ввода, и вам следует держаться от него подальше.

Ответ №1:

Я не знаю эту библиотеку, но она больше похожа на брендинг типов, чем на описание фактического формата ваших данных.

Короче говоря, фирменный стиль типа-это способ привести значение к типу, имеющему скрытое свойство. Это предотвращает использование вместо них других типов, которые могут иметь ту же форму. В некоторых случаях это делается из-за того, что для создания этих данных может потребоваться специальная процедура, которая должна быть применена.

Это дополнительно подтверждается тем фактом, что маркер __binaryDocument the появляется только один раз в объявлениях типов во всем этом репозитории, и это в типизациях. Это означает, что это конструкция только для типа земли.

Если это правильно, это означает, что вам нужно использовать одну из функций этой библиотеки, которая возвращает a BinaryDocument , чтобы она могла делать все, что ей нужно.

Согласно объявлениям типов этой библиотеки, это будут эти две функции:

 function save<T>(doc: Doc<T>): BinaryDocument
 

От: https://github.com/automerge/automerge/blob/d2e7ca2e141de0a72f540ddd738907bcde234183/@types/automerge/index.d.ts#L68

И:

 function save(state: BackendState): BinaryDocument
 

От:

https://github.com/automerge/automerge/blob/d2e7ca2e141de0a72f540ddd738907bcde234183/@types/automerge/index.d.ts#L156

Комментарии:

1. Да, именно так я и думал, когда смотрел на это.

2. Да, хороший крик, это определенно похоже на фирменный стиль. В документах указано «Automerge.save(doc) сериализует состояние документа Automerge doc в массив байтов (Uint8Array), который вы можете записать на диск». Проблема здесь в том, что мне нужно получить массив байтов из БД и ввести его в функцию Automerge.load(). Вот почему я пытался создать экземпляр BinaryDocument. Хм, похоже, я упускаю часть головоломки.

3. Для справки, я создал проблему на GitHub github.com/automerge/automerge/issues/408 чтобы получить дополнительную информацию.

Ответ №2:

Похоже, что простое приведение BinaryDocument -это все, что требуется. В моем случае я использую буфер, поэтому по какой-то причине мне приходится дважды приводить Buffer ->> Uint8Array -> > BinaryDocument . Я уже вижу, что машинопись будет веселой.

 const buffer = Buffer.from(dto.document, 'base64')
const document: BinaryDocument = Automerge.load(buffer as Uint8Array as BinaryDocument)