gpt4 book ai didi

javascript - 如何使用 Flow 泛型创建具有相同类型参数的泛型函数

转载 作者:行者123 更新时间:2023-12-03 03:07:47 28 4
gpt4 key购买 nike

我正在尝试围绕 lodash 的 isEqual 函数创建一个类型化包装器。我希望它仅适用于同一类型的两个参数。我有以下代码:

export function isEqual<T>(a: T, b: T): boolean {
return _.isEqual(a, b);
}

const c: boolean = isEqual('one', 2); // shouldn't it be a type error here?
console.log(c)

但它不起作用,因为可以向它传递两个不同类型的参数,而 Flow 对此没问题。实现这样的功能的正确方法是什么?

我使用的是 Flow 版本 0.58.0

最佳答案

经过一些研究,我可以解释导致这种行为的原因。 T隐式扩展为联合类型 isEqual<string|number>(a: string|number, b: string:number) 。我不能告诉你为什么,但github上有描述。 .

从上面 github 评论中的示例中,我通过使用幻像类型 P 提取了一个解决方案(或者更确切地说是一个 hack)。 :

type __R<T, T> = T;
type _R<T> = __R<*, T>;

type _Eq<T, U: _R<T>> = (T, U) => boolean;
type Eq<P> = _Eq<*, *>;

const eq:Eq<any> = (a, b) => a === b;

eq(true, false); // type checks

eq(1, 2); // type checks

eq(true, "foo"); // doesn't type check

Try it .

可能有一个不那么困惑的解决方案,但遗憾的是,flow 不仅仅统一具有相同名称和相同范围内相同类型的类型变量。

关于javascript - 如何使用 Flow 泛型创建具有相同类型参数的泛型函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47091373/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com