#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
И:
function save(state: BackendState): BinaryDocument
От:
Комментарии:
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)