当我使用泛型类型时,为什么“ void”不适用于可选参数?

时间:2019-04-21 17:45:31

标签: typescript

当我直接使用“ void”类型作为函数的参数时,它很好用,但是当我使用泛型时,则无法推断出它。

我使用TypeScript 3.4.4。

// It works perfectly :-)
function test(param: void){

}
test();
// It doesn't works :-(
type T = {
    a: {
        value: string;
    };
    b: {
        value: void;
    };
};
function test<KEY extends keyof T>(key: KEY, param: T[KEY]["value"]) {}
test("b"); // ERROR: Expected 2 arguments, but got 1. An argument for 'param' was not provided.

1 个答案:

答案 0 :(得分:2)

  

这是实施检查方式的设计限制。

     

在通用实例化之前完成对可以消除的void参数的检查,这意味着生成void参数的实例将被忽略,就像失败时一样。

     

做出此选择是为了避免必须检查每个通用签名两次,并且此操作会破坏现有的重载选择。

来源:https://github.com/Microsoft/TypeScript/issues/29131#issuecomment-449634318