如何使用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];
}
这时一切似乎都正常了。
当使用exec
为cmd2
编写args时,我可以看到编译器(打字稿)为3个args提供了类型信息。
返回值也正确...
但是,其余所有内容都落在包含声明...rest: U
的行中。
错误很简单:
A rest parameter must be of an array type.
答案 0 :(得分:1)
问题是exec()
,这意味着interface ICommandNameArgumentTypeMapping {
['cmd1']: [string];
['cmd2']: [boolean, number, string];
['cmd3']: [boolean, boolean];
}
type P = ICommandNameArgumentTypeMapping;
function exec<T, E extends keyof P, U extends P[E]>(command: E, ...rest: U): U{
return rest;
}
exec('cmd2', true, 1, 'hello');
接受任何作为您定义的接口的超集的映射。这将允许非数组类型。如果删除该约束(并修复我认为是错字的内容),则不会收到错误消息。
{{1}}
答案 1 :(得分:0)
在编写...rest
时,rest
是一个数组:
const someFunction = (...args) => console.log(args);
someFunction('hello', 'world');
您应该这样写:
(command: E, ...rest: U[])
或其他符合您程序所需行为的类似内容。