【发布时间】:2021-02-08 05:24:13
【问题描述】:
我正在尝试用几个方法构建一个接口,然后根据传入的数据作为该对象的键之一调用这些方法。
这是我的类型:
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[]>;
}
这是我正在使用的对象:
export const logicalFunctions: LogicalFunctions = {
$not: (expression: QueryObject) => `NOT(${queryBuilder(expression)})`,
$and: (args: QueryObject[]) => `AND(${queryBuilder(args)})`,
$or: (args: QueryObject[]) => `OR(${queryBuilder(args)})`,
};
最后,我实际调用函数的地方:
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[]'
我不确定我是否只是用某种反模式编写了这个,或者我只是遗漏了一些东西。任何帮助或指导将不胜感激:)
【问题讨论】:
-
请提供一个完整的最小示例。我尝试在这里复制它没有成功:tsplay.dev/8w8O4W。您可以编辑它并帮助说明问题。同时,我认为你应该改用
(args: QueryObject | QueryObject[]) => string这个
标签: typescript compiler-errors static-typing union-types