首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理并集与交集Typescript的问题

问处理并集与交集Typescript的问题
EN

Stack Overflow用户
提问于 2021-02-08 13:24:14
回答 1查看 28关注 0票数 1

我正在尝试用几个方法构建一个接口,然后根据传入的数据块调用这些方法,这是该对象的关键字之一。

下面是我的类型:

代码语言:javascript
复制
type LogicalFunction<T> = (args: T) => string;

export interface LogicalFunctions
  extends Record<string, (args: QueryObject & QueryObject[]) => string> {
  $not: LogicalFunction<QueryObject>;
  $and: LogicalFunction<QueryObject[]>;
  $or: LogicalFunction<QueryObject[]>;
}

下面是我正在使用的对象:

代码语言:javascript
复制
export const logicalFunctions: LogicalFunctions = {
  $not: (expression: QueryObject) => `NOT(${queryBuilder(expression)})`,
  $and: (args: QueryObject[]) => `AND(${queryBuilder(args)})`,
  $or: (args: QueryObject[]) => `OR(${queryBuilder(args)})`,
};

最后,在我实际调用函数的地方:

代码语言:javascript
复制
if (
  key in logicalFunctions 
  && (isQueryObject(val) || (val instanceof Array && val.every(v => isQueryObject(v))))
) { logicalFunctions[key](val); }

但正如我所写的,我从Typescript编译器得到以下错误:

Argument of type 'QueryObject | QueryObject[]' is not assignable to parameter of type 'QueryObject & QueryObject[]'

我不确定我是不是用某种反模式写的,或者我只是遗漏了什么。任何帮助或指导都将不胜感激:)

EN

回答 1

Stack Overflow用户

发布于 2021-02-08 15:52:12

QueryObject & QueryObject[]意味着参数必须同时是一个QueryObject和一个QueryObjects数组。这很可能是不可能的。

QueryObject | QueryObject[]表示参数可以是QueryObject,也可以是QueryObjects数组。这可能就是你想要的。

在本例中为viewable in Typescript Playground

代码语言:javascript
复制
type T = number | T[]
const t0:T&T[] = [2]   // OK
const t1:T&T[] = 2     // NG

type U = number
const u0:U&U[] = [2]   // NG
const u1:U&U[] = 2     // NG

const uu0:U|U[] = [2]   // OK
const uu1:U|U[] = 2     // OK

variable t0既是T又是T[] (T数组)-只是为了向您展示这样的事情是可能的。t1、u0和u1都是编译错误。

但是,uu0和uu1是可以的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66096287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档