gpt4 book ai didi

typescript - 是否可以为方法装饰器选项提供类型安全

转载 作者:搜寻专家 更新时间:2023-10-30 21:45:19 24 4
gpt4 key购买 nike

我决定编写一些实用装饰器,例如 memoizerateLimiter。我想在没有不必要的样板代码的情况下尽可能多地实现类型安全。

是否可以在不手动指定泛型的情况下确保装饰器中的完全类型安全?

type GET_FUNCTION_SIGNATURE<
T extends TypedPropertyDescriptor<any>
> = T extends TypedPropertyDescriptor<infer U> ? U : never;

interface ITestDecoratorOptions<DECORATED_FUNCTION_ARGUMENTS_TYPE, DECORATED_FUNCTION_RETURN_TYPE> {
getKeyFromArgs: (args: DECORATED_FUNCTION_ARGUMENTS_TYPE) => string;
getDefaultValue: (args: DECORATED_FUNCTION_ARGUMENTS_TYPE) => DECORATED_FUNCTION_RETURN_TYPE;
}

const testDecorator = <TYPED_PROPERTY_DESCRIPTOR extends TypedPropertyDescriptor<any>>(
options: ITestDecoratorOptions<
Parameters<GET_FUNCTION_SIGNATURE<TYPED_PROPERTY_DESCRIPTOR>>,
ReturnType<GET_FUNCTION_SIGNATURE<TYPED_PROPERTY_DESCRIPTOR>>
>
) => {
return (
target: Object,
key: string,
descriptor = Object.getOwnPropertyDescriptor(target, key) as PropertyDescriptor
): TYPED_PROPERTY_DESCRIPTOR => {
return null as any;
};
};

class Test {
// \/ Is it possible to remove that generic and keep full type safety here?
@testDecorator<TypedPropertyDescriptor<(a: number, b: string) => boolean>>({
getKeyFromArgs: args => {
// number string
return args[0].toString() + args[1]; // full type checking
},
getDefaultValue: args => {
// full type checking: on args(number, string) and return type(boolean)
if (args[0] === 1) {
return true;
}

return false;
}
})
public someMethod(a: number, b: string): boolean {
return true;
}
}

最佳答案

这是一个 known issue在 TypeScript 中,没有明显的解决方案(除了手动指定泛型类型参数)。

实现这个的问题,如 this comment by @DanielRosenwasser 中所述是使用装饰器就像调用 curried函数,而你想要的那种通用推理将是这样的:

declare let f: <T>(callback: (x: T) => void) => (y: T) => void;
f(x => x.a)({ a: 100 }); // error!
// ~ <-- T is inferred as {} or unknown,

这不起作用,因为当函数 f 在其回调参数上被调用时,TypeScript 会推断泛型类型,并且不会等到返回的函数本身被调用。因此,当 T 类型实际上被编译器识别时,为时已晚,并且已经无法正确推断。

除了继续手动指定参数之外,我不知道我是否有任何建议,也许可以在 TypeScript 中解决这个问题并给它一个 👍 或者描述你的用例,如果你认为它比其他的更引人注目提及。祝你好运!

关于typescript - 是否可以为方法装饰器选项提供类型安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56403431/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com