我正在尝试使用一个名为Automerge的JS库。库包含一个声明如下的类型:
type BinaryDocument = Uint8Array & { __binaryDocument: true }
请注意,__binaryDocument
是一个文字类型true。
如何很好地实例化这样一个类型?
我最终得到了这个,这似乎有些过头了:
class BinaryDocument extends Uint8Array {
__binaryDocument: true
constructor(val: Uint8Array) {
super(val)
}
static from(buffer: Uint8Array): BinaryDocument {
return new BinaryDocument(buffer)
}
}
我不知道这个库,但它看起来更像是类型品牌,而不是描述数据的实际格式。
简而言之,类型品牌是将值强制转换为具有隐藏属性的类型的一种方式。这样可以防止使用可能具有相同形状的其他类型。在某些情况下,这样做是因为可能有一个特殊的程序来创建需要强制执行的数据。
令牌__binaryDocument
在整个存储库的类型声明中只出现一次,这一事实进一步支持了这一点,即在打字员中。这意味着它是一种仅限土地使用的建筑。
如果这是正确的,那就意味着你需要使用其中一个返回BinaryDocument
的库函数,这样它就可以做任何需要做的特殊事情
根据该lib的类型声明,这将是以下两个函数:
function save<T>(doc: Doc<T>): BinaryDocument
发件人:https://github.com/automerge/automerge/blob/d2e7ca2e141de0a72f540ddd738907bcde234183/%40types/automerge/index.d.ts#L68
和:
function save(state: BackendState): BinaryDocument
发件人:
https://github.com/automerge/automerge/blob/d2e7ca2e141de0a72f540ddd738907bcde234183/%40types/automerge/index.d.ts#L156
似乎只需要简单地转换为BinaryDocument
。在我的情况下,我使用的是Buffer,因此出于某种原因,我必须双重转换Buffer
->Uint8Array
->BinaryDocument
。我已经看到TypeScript会很有趣。
const buffer = Buffer.from(dto.document, 'base64')
const document: BinaryDocument = Automerge.load(buffer as Uint8Array as BinaryDocument)