如何解决处理联合与交叉打字稿的问题
我正在尝试用几个方法构建一个接口,然后根据作为该对象的键之一的传入数据调用这些方法。
这是我的类型:
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[]'
我不确定我是否刚刚用某种反模式写了这个,或者我是否只是遗漏了一些东西。任何帮助或指导将不胜感激:)
解决方法
QueryObject & QueryObject[]
表示参数必须同时是 QueryObject
和 QueryObjects
数组。这很可能是不可能的。
QueryObject | QueryObject[]
表示参数是 QueryObject
或 QueryObjects
数组。这可能就是您想要的。
在这个例子中viewable in Typescript Playground:
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
变量 t0
既是 T
又是 T[]
(T
的数组)——只是为了向您展示这样的事情是可能的。 t1
、u0
和 u1
都是编译错误。
不过,uu0
和 uu1
没问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。