我决定编写一些实用程序修饰符,例如impl Trait
,memoize
。我想在没有不必要的样板代码的情况下实现尽可能多的类型安全性。
是否可以在没有人工指定的泛型的情况下确保装饰器中的全类型安全?
rateLimiter
答案 0 :(得分:1)
这是TypeScript中的known issue,没有明显的解决方案(除了手动指定通用类型参数之外)。
如this comment by @DanielRosenwasser所述,实现此问题的原因是使用修饰符就像调用curried函数,而您想要的通用推断类型如下:
declare let f: <T>(callback: (x: T) => void) => (y: T) => void;
f(x => x.a)({ a: 100 }); // error!
// ~ <-- T is inferred as {} or unknown,
无效,因为当在其回调参数上调用函数f
时,TypeScript会推断泛型,并且不会等到返回的函数本身被调用。因此,到实际知道T
类型为编译器时,为时已晚,并且已经无法正确推断出。
除了继续手动指定参数外,我不知道有什么建议,如果您认为它比上面提到的其他方法更具说服力,也许可以在TypeScript中解决该问题并给出一个或描述您的用例。祝你好运!