装饰器中用于打字稿的内部参数

时间:2019-10-20 23:27:30

标签: typescript

下面是一个示例程序,该程序创建装饰器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');
    }
}

0 个答案:

没有答案