具有类型安全 keyof 参数的装饰器

时间:2021-04-19 05:48:40

标签: typescript

我正在尝试创建属性装饰器,它接受一个属性键和一个函数,该函数接受该键的值并返回装饰器所在的属性。

class Example {
    foo: string;
    
    // Should work
    @decorator('foo', (val: string) => !!val)
    bar: boolean;
    
    // Should error
    @decorator('foo', (val: string) => 'string')
    bar1: boolean;
    
    // Should error
    @decorator('foo', (val: boolean) => !!val)
    bar2: boolean;
    
    // Should error
    @decorator('doesntExist', (val: any) => !!val)
    bar3: boolean;
}

我在 github 上找到了这篇文章,想知道是否有人知道如何针对当前情况修改它:https://github.com/microsoft/TypeScript/issues/17795#issuecomment-324368400;

到目前为止我所得到的是:

    export function decorator<CK extends string, V, R>(property: CK, callback: (val: V) => R) {
    return <
        T extends {} & { [P in CK]: V } & { [P in K]: R },
        K extends keyof T>(
            proto: T,
            propertyKey: K) => {
            // Operations....
    }
}

但是好像不行。有任何想法吗?基本上,不是验证属性是否具有相同的类型,我想验证它们是否与函数参数类型匹配(输入应与作为参数传递的属性相匹配,而装饰器应用于的属性应与返回值相匹配类型)

0 个答案:

没有答案