使用:
- NodeJS
v16.16.0
- “@elastic/elasticsearch”:“8.7.0”,
我想创建一个函数,将接受多种批量操作。我的目标是确保这些函数的输入将影响我的索引与良好的值(在这里a
或b
)。
下面是我无法正确键入的代码段:
import { Client } from "@elastic/elasticsearch";
// Operation 1 affect 1 index with "index" action
interface Op1IndexRow {
index: {
_index: string;
_id: string;
retry_on_conflict: number;
}
}
interface Op1BulkDocument {
a: string,
}
type Op1BulkBody = Array<Op1BulkDocument | Op1IndexRow>;
interface Op2IndexRow {
index: {
_index: string;
_id: string;
retry_on_conflict: number;
}
}
interface Op2BulkDocument {
b: string,
}
type Op2BulkBody = Array<Op2BulkDocument | Op2IndexRow>;
const client = new Client({
node: 'localhost'
})
const bulkSave = async (operations: Op1BulkBody | Op2BulkBody) => {
await client.bulk({
refresh: true,
operations,
});
}
我真的不明白的是,我可以使它“typescript友好”与以下类型:Array<Op1BulkDocument | Op1IndexRow | Op2BulkDocument | Op2IndexRow>
。
问题是,这种类型对我来说是错误的,因为操作要么是Op1BulkDocument | Op1IndexRow
,要么是Op2BulkDocument | Op2IndexRow
,但绝不会同时发生。
1条答案
按热度按时间9bfwbjaz1#
您提供的代码几乎可以满足您的要求。例如,它不允许您混合使用
Op1BulkDocument
和Op2BulkDocument
:类型“(Op1BulkDocument)”的参数|Op2BulkDocument)[]”不能分配给类型为“Op1BulkBody”的参数|Op2BulkBody'.
这是因为
Op1BulkDocument
有一个成员a
,而Op2BulkDocument
没有。但是,它允许您将
Op1IndexRow
与Op2IndexRow
混合使用:为什么?错误消息已经给了你一个提示:
Op1IndexRow
和Op2IndexRow
具有相同的定义。您可以将Op1IndexRow
类型的变量 * 赋值 * 到Op2IndexRow
类型的变量,因为它们具有兼容的定义。TypeScript不查看确切的接口名称,而是检查接口定义是否兼容(是 * 可赋值 *)。
我建议您使用单个接口
OpIndexRow
,而不是两个不同(但相同)的接口。