我希望装饰的函数的参数类型受到限制。对于一个函数签名来说,这是可行的,因为它可以传递到TypedPropertyDescriptor<T>
中。但是对于多个或,如果省略了参数,则失败Type '({ abc }: { abc: string; }, context: any) => string' is not assignable to type 'Signature<{ abc: any; }>'
。
这是我想出的代码:
class Test {
// works
@Decorator('abc')
test0(): string {
return '';
}
// fails
@Decorator('abc')
test1({abc}: {abc: string}): string {
return '';
}
// fails
@Decorator('abc')
test2({abc}: {abc: string}, context: any): string {
return '';
}
}
interface Signature<T> extends Function {
(args: T, context: any): any;
(args: T): any;
(): any;
}
function Decorator<T>(...args: Array<keyof T>) {
return function (target: any, key: string, descriptor: TypedPropertyDescriptor<Signature<T>>) {
// do something
}
}
现在,关于类,这不是问题。方法实现可以忽略参数。这很令人困惑。
我注意到,将参数标记为可选作品,但随后我必须做多余的空检查才能正确键入。
您可以找到一个REPL here。