[英]Get Typescript to infer a union type
我正在尝试创建一个相对简单的 function 签名,如下所示:
function<U>(...args:U[]):U {/* body */}
我希望 typescript 将传递给联合的参数的类型组合起来,而不是简单地将 U 推断为第一个参数的类型。 请问我怎么会 go 关于这个?
您遇到的问题是以下代码会产生编译器错误:
function f<U>(...args: U[]): U {
return args[Math.floor(Math.random() * args.length)]
}
const a = f("string", 123, true); // error!
// ~~~ <-- error! 123 is not a string
// U inferred as string
// const a: string
编译器启发式阻止在这里推断联合,因为人们经常希望发生这种错误。 请参阅为什么不将类型参数推断为联合类型? 了解更多信息。
在microsoft/TypeScript#44312有一个开放功能请求,要求以某种方式告诉编译器您想要联合而不是错误。 目前这是不可能的,所以如果你想要类似的行为,你需要使用变通方法。
一种常见的解决方法是更改 function 以便它不是在args
元素的类型U
中通用,而是在args
本身的数组类型T
中通用。 从那里,您可以使用number
索引到该类型以获取元素类型。 也就是说,如果T
是类数组类型,则T[number]
是元素类型(因为这是使用number
索引数组时得到的类型):
function f<T extends any[]>(...args: T): T[number] {
return args[Math.floor(Math.random() * args.length)]
}
const a = f("string", 123, true);
// T inferred as [string, number, boolean]
// const a: string | number | boolean
现在没有错误了, a
的类型就是你想要的 union。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.