TypeScript中的强类型休息参数

时间:2019-03-12 01:11:40

标签: typescript typescript-generics

如何使用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];
}

这时一切似乎都正常了。 当使用execcmd2编写args时,我可以看到编译器(打字稿)为3个args提供了类型信息。 返回值也正确...

但是,其余所有内容都落在包含声明...rest: U的行中。

错误很简单: A rest parameter must be of an array type.

2 个答案:

答案 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[])

或其他符合您程序所需行为的类似内容。