实例化交叉点类型



我正在尝试使用一个名为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)

最新更新