gpt4 book ai didi

typescript - 为什么我不能使用联合类型参数调用泛型函数?

转载 作者:行者123 更新时间:2023-12-04 13:16:20 25 4
gpt4 key购买 nike

interface A {
kind: 'a';
a: string;
}

interface B {
kind: 'b';
b: number;
}

type Transform<T extends A | B> = [T, T];

declare function processTransformed<T extends A | B>(arg: Transform<T>): string;

我有一组转换后的 AB我想处理但以下代码无法编译。
type U = Transform<A> | Transform<B>;

function test(arr: U[]) {
// Argument of type '<T extends A | B>(arg: Transform<T>) => string' is not assignable to
// parameter of type '(value: U, index: number, array: U[]) => string'.
// Types of parameters 'arg' and 'value' are incompatible.
// Type 'U' is not assignable to type 'Transform<A>'.
// Type 'Transform<B>' is not assignable to type 'Transform<A>'.
// Property 'a' is missing in type 'B' but required in type 'A'.(2345)
return arr.map(processTransformed);
}

为什么我会收到此错误,我该如何解决?有没有我可以阅读的 Material ?

最佳答案

对我来说,这感觉像是 TypeScript 中的一个错误,可能类似于 microsoft/TypeScript#29479 .它看起来像 inference from mapped types没有正确推断类型参数的联合类型。 (到目前为止,我还没有发现专门关于从映射类型推断联合的现有问题,但它可能存在。如果有人对此有更多了解,我很想听听它)。

我看不到任何修复即将推出,但在可能相关的问题中提到的解决方法是,如果无法正确推断出函数的泛型类型参数,则明确指定它们。

在您的情况下,由于您将函数作为回调传递,您必须执行类似 eta-expand 的操作来自 f 的函数至 x => f(x)允许这样的规范,像这样:

function test(arr: U[]) {
return arr.map(u => processTransformed<A | B>(u)); // okay
}

希望这能让你继续前进。祝你好运!

Playground link to code

关于typescript - 为什么我不能使用联合类型参数调用泛型函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60067893/

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