我想写一个可以从一个类的键中获取键的类型,如果键的值是一个函数,则该类型的值必须等于该函数的参数的类型。它可能看起来很复杂,并且解释可能不是最好的,但是代码可能会有所帮助:
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
。
答案 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;
};
那应该对您有用。希望能有所帮助;祝你好运!