gpt4 book ai didi

typescript - 为什么不解析函数参数的类型,对象的哪个元素( typescript )?

转载 作者:搜寻专家 更新时间:2023-10-30 21:22:30 25 4
gpt4 key购买 nike

谁能帮帮我?这是 3 个示例:a、b、c。对于第一个和第二个“arg”类型为真(数字)。对于第三版, typescript 无法解析“arg”的类型。

function a<T extends (value: number) => string>(
arg: T,
) {
return null;
}

a((arg) => arg.toExponential()); // ARG HAS RIGHT TYPE: number

function b<T extends { [index: string]: (value: number) => string }>(
arg: T,
) {
return null;
}
b({ x: (arg) => arg.toExponential() }); // ARG HAS RIGHT TYPE: number

function c<K extends { [index: string]: number }, T extends {[P in keyof K]?: ((value: number) => string) }>(
arg1: K,
arg2: T,
) {
return null;
}
c({ x: 15 }, { x: (arg) => arg.toExponential() }); // ARGS NOT HAS TYPE: any

最佳答案

当两个类型参数具有依赖关系并且需要推断一个依赖于另一个时,编译器会有点困惑。我使用的一个简单解决方法是进行两步调用,第一个函数修复第一个参数类型,第二个调用可以推断其余类型:

function c<K extends { [index: string]: number }>(arg1: K)
{
return function <T extends {[P in keyof K]?: ((value: number) => string) }>(arg2: T){
};
}


c({ x: 15 })({ x: (arg) => arg.toExponential() }); // arg will be number

编辑

尽管上述解决方案有效并正确推断出 T,正如@MihailMalostanidis 所建议的那样,但在这种情况下可能根本没有必要使用第二个参数。这也正确推断:

function c<K extends { [index: string]: number } >(
arg1: K,
arg2: {[P in keyof K]?: ((value: number) => string) },
) {
return null;
}

不同之处在于,如果您要从函数(或基于 T 的类型)返回 arg2,则在此版本中 K< 的所有键 会出现,而不仅仅是调用时在 arg2 中实际指定的那些。根据您的用例,这可能是可以接受的,但初始解决方案适用于所有情况。

关于typescript - 为什么不解析函数参数的类型,对象的哪个元素( typescript )?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48629802/

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