类型'Function&InputTypeComposer <any> [key]'不满足约束'(... args:any)=> any'

时间:2019-11-29 17:54:35

标签: typescript

我想写一个可以从一个类的键中获取键的类型,如果键的值是一个函数,则该类型的值必须等于该函数的参数的类型。它可能看起来很复杂,并且解释可能不是最好的,但是代码可能会有所帮助:

type Extensions = {
  [key in keyof InputTypeComposer]: InputTypeComposer[key] extends Function
    ? Parameters<InputTypeComposer[key]>
    /*
      Type 'Function & InputTypeComposer<any>[key]' does not satisfy
      the constraint '(...args: any) => any'.ts(2344)
    */
    : never;
};

任何建议为何会引发错误?问题在哪里?

可以找到here的类型InputTypeComposer

1 个答案:

答案 0 :(得分:1)

无论出于何种原因,Function interface都没有用可调用的签名声明,尽管可以像调用Function类型那样调用(...args: any) => any类型的对象。如果您觉得这很奇怪,可能有一个open issue (microsoft/TypeScript#20007),您可能想访问并输入?。 says的解释:

  

Function的初衷是不可调用的。换句话说,函数类型的Function应该与其他类型的unknown类似,但不可调用。此后,我们通过特殊的大小写放宽了此限制,使Function在编译器中具有可调用的行为。我们已经讨论过使此错误--noImplicitAny,因为调用Function确实是不安全的。

无论如何,这里有一个简单的解决方法:将Function抛弃(...args: any) => any

type Extensions = {
  [key in keyof InputTypeComposer]: InputTypeComposer[key] extends (...args: any) => any
  ? Parameters<InputTypeComposer[key]>
  : never;
};

那应该对您有用。希望能有所帮助;祝你好运!

Link to code