ElasticSearch节点客户端的Typescript误解

csbfibhn  于 2023-04-20  发布在  ElasticSearch
关注(0)|答案(1)|浏览(87)

使用:

  • NodeJS v16.16.0
  • “@elastic/elasticsearch”:“8.7.0”,

我想创建一个函数,将接受多种批量操作。我的目标是确保这些函数的输入将影响我的索引与良好的值(在这里ab)。
下面是我无法正确键入的代码段:

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,但绝不会同时发生。

9bfwbjaz

9bfwbjaz1#

您提供的代码几乎可以满足您的要求。例如,它不允许您混合使用Op1BulkDocumentOp2BulkDocument

declare const op1doc: Op1BulkDocument;
declare const op2doc: Op2BulkDocument;
bulkSave([op1doc, op2doc]);

类型“(Op1BulkDocument)”的参数|Op2BulkDocument)[]”不能分配给类型为“Op1BulkBody”的参数|Op2BulkBody'.
这是因为Op1BulkDocument有一个成员a,而Op2BulkDocument没有。
但是,它允许您将Op1IndexRowOp2IndexRow混合使用:

declare const op1index: Op1IndexRow;
declare const op2index: Op2IndexRow;
bulkSave([op1index, op2index]);

为什么?错误消息已经给了你一个提示:Op1IndexRowOp2IndexRow具有相同的定义。您可以将Op1IndexRow类型的变量 * 赋值 * 到Op2IndexRow类型的变量,因为它们具有兼容的定义。
TypeScript不查看确切的接口名称,而是检查接口定义是否兼容(是 * 可赋值 *)。
我建议您使用单个接口OpIndexRow,而不是两个不同(但相同)的接口。

相关问题