最后一个参数位置中类型为T的那些函数的类型

DWR

我希望创建一个T在最后一个参数位置使用type表示这些函数的类型可变参数元组类型看起来可以毫无问题地解决此问题,但是在我目前的方法中,类型如下:

type TasLastArg<T> = (...args: [...any, T]) => any;

args争论已经变成了any[]其他地方也有类似的行为,使我认为这应该是可能的。当前行不通的示例/我认为有可能的原因:

type TasFirstArg<T> = (...args: [T, ...any]) => any;  // this appears to work as expected
type TasLastArg<T> = (...args: [...any, T]) => any; // would like for this to work

namespace T_in_first_place {
    const ok : TasFirstArg<string> = (x:string, y: number, z: string) => { return 0; }
    const correctly_fails : TasFirstArg<string> = (x:number, y: number, z: number) => { return 0; }
}
namespace T_in_last_place {
    const ok : TasLastArg<string> = (x:number, y: number, z: string) => { return 0; }
    const should_fail_but_does_not: TasLastArg<string> = (x:number, y: number, z: number) => { return 0; }
}

// there is some machinery that allows looking at the last type in a tuple:
type CheckStringIsLast<T extends any[]> = T extends [...infer first, string] ? true : false;
type it_checks_this_fine = CheckStringIsLast<[number, number, string]>; // true
type it_properly_rejects_this = CheckStringIsLast<[number, number, number]>; // false

是不可能的,还是我错过了什么?

贾卡尔兹

TypeScript 4.1仅在元组类型末尾支持rest元素可变的元组类型允许您编写 [...any, T],但是折叠到any[]

当发布TypeScript 4.2时,它应该开始在其开头或中间开始接受rest元素(但每个元组仅接受一个rest元素)。有关实现此功能的PR,请参阅microsoft / TypeScript#41544此时,将按您的意图[...any, T]解释为[...any[], T],表示“T末尾有任何元组”。

请注意,但是一旦支持,您的示例就不会真正实现您的预​​期:

const ok : TasLastArg<string> = (x:number, y: number, z: string) => { return 0; } // error!
// -> ~~
// Target requires 3 element(s) but source may have fewer

这是一个错误,因为当目标函数确实需要一个string作为最后一个元素,它不符合TasLastArg<string>,这就需要将接受一个函数的任何参数列表,在一个结束string这意味着您需要能够通过以下方式进行调用:

ok("shouldWork");
ok(1, 2, 3, 4, 5, 6, 7, true, new Date(), "shouldAlsoWork");

(x: number, y: number, z: string) => number如果type的实现对,和进行了任何有意义的操作x对于type函数将是灾难性的如果要实现它需要以正确的方式本身就是可变的函数:yz

const reallyOkay: TasLastArg<string> = (...args: [...initArgs: any[], lastArg: string]) => {
    console.log((args[args.length - 1] as string).toUpperCase());
}
reallyOkay("shouldWork"); // SHOULDWORK
reallyOkay(1, 2, 3, 4, 5, 6, 7, true, new Date(), "shouldAlsoWork"); // SHOULDALSOWORK

而且,至少在最初,它似乎还不会自动args[args.length-1]解释string

操场上的代码链接

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Typescript:获取函数类型的最后一个参数的类型

如何获得省略最后一个参数的函数类型

Typescript如何删除函数类型的最后一个参数?

如何在Golang中编写一个以多种类型为参数的函数?

... 中构造函数的参数 0 需要一个类型为 ... 的 bean,但无法找到

为什么C#只允许最后一个参数为“参数类型”

恐慌:最后一个参数必须为http.HandlerFunc类型

为什么gcc从这里的回调函数的最后一个参数推断类型?

在链表 C 中插入一个节点:预期的 node_t * 但参数的类型为 node_t

从任意数量的闭包中获取最后一个函数的类型

是否有一个TypeScript`Partial <any>`类型的函数参数接受`any`但为`void`?

在PostgreSQL中,如何声明一个接受不同类型参数的可变参数函数?

是否可以将构造函数用作TypeScript中另一个函数的参数类型?

在函数模板中,如何根据另一个参数确定一个参数的类型

改变第一个参数类型的增强函数?

引用当前函数的第一个参数类型

如何获取函数的第一个参数的类型?

只覆盖函数中的最后一个默认参数

我可以在C#中为一个参数接受多种类型吗?

如何创建一个名为 isNumber 的函数,该函数接收名为 val 的参数并返回一个布尔值,指示参数是否为 number 类型

B类中构造函数的参数0需要一个找不到A类类型的Bean

X 中构造函数的参数 0 需要一个无法找到的“Y”类型的 bean

在 Rust 中,如何创建一个接受“标记组件”作为类型参数的函数?

[]中构造函数的参数0需要一个[]类型的Bean

无法将结构类型参数传递给另一个包中的函数

C ++ 11中成员函数的第一个参数的类型

*Service 中构造函数的参数 0 需要一个无法找到的“*Repository”类型的 bean

对于流类型,是否可以自动推断以另一个函数为参数的函数的返回值?

如何在Swift中定义一个包含另一个无参数的函数的返回类型?