如果指定了泛型,则不允许任何调用

时间:2019-04-08 16:30:54

标签: typescript generics

我尝试应用this solution禁止调用第二种类型等于MAIL_DRIVER=mail MAIL_HOST=mail.openroomlist.com MAIL_PORT=465 MAIL_USERNAME=support@openroomlist.com MAIL_PASSWORD=******** MAIL_ENCRYPTION=tls 的泛型函数。

以下构造工作直到明确指定第一个通用参数为止:

any

如果我需要 declare function f<V = any, A extends ISmth = ISmth>(a: IfAny<A, never, A>): V; 作为第一个参数并且是可选参数(它是返回类型且不能推断-应该以显式方式指定或任意指定),该如何修复代码?

我尝试更改默认值,但它会打断任何带有显式第一种类型的呼叫:

V

Full code:

declare function g<V = any, A extends ISmth = any>(a: IfAny<A, never, A>): V;

1 个答案:

答案 0 :(得分:2)

TypeScript中目前没有partial type argument inference,因此对您不起作用。解决方法是制作一个curried函数,在该函数中您手动指定一个类型参数并返回一个推断其类型参数的函数:

declare const fCurry: <V = any>() => 
  <A extends ISmth = ISmth>(a: IfAny<A, never, A>) => V;
fCurry()(x); // no error
fCurry()(y); // error
fCurry<string>()(x); // no error
fCurry<string>()(y); // error

或者您创建了一个函数,该函数为要手动指定的类型参数使用伪参数...在运行时可以为null,但是您可以使用类型断言来让编译器知道您的意思是什么类型:

declare function fDummy<V = any, A extends ISmth = ISmth>(
  a: IfAny<A, never, A>, 
  dummy?: V
): V;
fDummy(x); // no error
fDummy(y); // error
fDummy(x, null! as string); // no error
fDummy(y, null! as string); // error

这两种方法都不完美,但是它们具有所需的行为。希望能有所帮助。祝你好运!