gpt4 book ai didi

typescript - TypeScript 中的强类型剩余参数

转载 作者:行者123 更新时间:2023-12-05 02:13:09 25 4
gpt4 key购买 nike

如何使用 TypeScript 3.2 定义动态强类型剩余参数?这是我的用例:

function exec<T, P extends ICommandNameArgumentTypeMapping, E extends keyof P, U extends P[E]>(command: E, ...rest: U): U{
return;
}

exec('cmd2', true, 1, 'hello');

interface ICommandNameArgumentTypeMapping {
['cmd1']: [string];
['cmd2']: [boolean, number, string];
['cmd2']: [boolean, boolean];
}

此时一切似乎都正常了。当使用 cmd2exec 编写参数时,我可以看到编译器( typescript )为 3 个参数提供类型信息。返回值也正确...

然而,事情在包含声明 ...rest: U 的行中失败了。

错误很简单:rest 参数必须是数组类型。

最佳答案

问题

U 必须是数组。我们知道 UP 的值,但不能保证 P 的所有值都是数组。这是因为 exec 不依赖于下面定义的具体 ICommandNameArgumentTypeMapping 接口(interface),而是依赖于一些我们还不完全了解的 P。因为我们还不知道它,所以我们不能相信它会遵循 ICommandNameArgumentTypeMapping 的蓝图 — 毕竟,它可能会添加一些自己的属性,这些属性不是数组。

解决方案

解决方案是确保所有值(现在和 future )始终是数组。

interface ICommandNameArgumentTypeMapping {
['cmd1']: [string];
['cmd2']: [boolean, number, string];
['cmd3']: [boolean, boolean];
[index: string]: any[]
}

这个额外的属性称为索引签名

当然,您可以在这里更精确地使用 (string | number | boolean)[] 而不是 any[]

奖励积分

您的代码中还有一些错误:

  • 计算属性名称 cmd2 重复
  • 未使用T 类型参数
  • P 类型参数使用不当(既不用于描述参数也不用于返回类型)
  • exec promise 返回 U,但它返回的是 undefined

更正的解决方案:

function exec<P extends ICommandNameArgumentTypeMapping, E extends keyof P, U extends P[E]>(mapping: P, command: E, ...rest: U): U{
return rest;
}

interface ICommandNameArgumentTypeMapping {
['cmd1']: [string];
['cmd2']: [boolean, number, string];
['cmd3']: [boolean, boolean];
[index: string]: any[]
}

declare const mapping: ICommandNameArgumentTypeMapping;

exec(mapping, 'cmd2', true, 1, 'hello');

关于typescript - TypeScript 中的强类型剩余参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55112694/

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