Я хочу, чтобы функции, которые я украшаю, были ограничены в своих типах аргументов. Это возможно для одной сигнатуры функции, так как она может быть передана в 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 здесь .