下面是一个示例程序,该程序创建装饰器decorate
并将其应用于类成员。 decorate
装饰器旨在接受与类成员相同的参数。但是,该程序可以编译,因为我已经强制将装饰器的T
泛型推论到any
。
我正在寻找一种方法,因为doesNotExist
不是该方法的第一个参数的有效成员,因此可以正确地推断装饰器函数的参数并使编译失败。
function decorate<T extends (...args:any) => any>(fn: (...args: Parameters<T>) => void) {
return (target: any, propertyName: string, descriptor: TypedPropertyDescriptor<any>) => {
descriptor.value = function (...args: Parameters<T>) { fn(...args) }
return descriptor;
}
}
class Foo {
// arg should be inferred to { qux: string } and compilation should fail
@decorate(arg => {
console.log(arg.doesNotExist);
})
bar(baz: { qux: string }) {
console.log('orig');
}
}