繁体   English   中英

获取 Typescript 以推断联合类型

[英]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。

Playground 代码链接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM