程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了来自扩展运算符的打字稿联合类型大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决来自扩展运算符的打字稿联合类型?

开发过程中遇到来自扩展运算符的打字稿联合类型的问题如何解决?下面主要结合日常开发的经验,给出你关于来自扩展运算符的打字稿联合类型的解决方法建议,希望对你解决来自扩展运算符的打字稿联合类型有所启发或帮助;

我有一个具有以下签名的函数:

test<T>(...args: T[]): T

如果我这样调用函数:

const a = test(1,2,3)

一切都按预期工作(a 属于 number 类型),但如果我这样称呼它:

const a = test(1,"asd")

我收到任何错误: [编辑] 2 是红色下划线:Argument of type '2' is not assignable to parameter of type '1'.,女巫可能有点误导,因为参数是常量,但如果我这样称呼它:

let arg1 = 1;
let arg2 = "asd";
const a = test(arg1,arg2);

我收到错误:Argument of type 'String' is not assignable to parameter of type 'number'.

如何才能使函数(在第二种情况下)具有 number | String 的返回类型 而无需在泛型参数中明确指定它。

解决方法

我认为这是您正在寻找的呼叫签名:

<T extends Array<unknown>>(...args: T): T[number]

TypeScript Playground

,

有意不将 T 推断为联合;有关原因,请参阅 Why isn't the type argument inferred as a union type? 以及 microsoft/TypeScript#19596 和 microsoft/TypeScript#26746。

可能最简单的方法是允许 args 为任何数组类型 T,然后通过 indexing into it 使用键类型 number 获取其元素类型:

declare function test<T extends anY[]>(...args: T): T[number];
const a = test(1,2,3) // number
const b = test(1,"asd") // number | String

Playground link to code

大佬总结

以上是大佬教程为你收集整理的来自扩展运算符的打字稿联合类型全部内容,希望文章能够帮你解决来自扩展运算符的打字稿联合类型所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。