如何约束装饰器的类型参数为被装饰方法返回类型的子集
如何约束装饰器的类型参数为被装饰方法返回类型的子集
我现在正尝试实现一个装饰器,要求它的类型参数U必须是被装饰方法返回类型的子集,但折腾了半天都没搞定,我的代码是这样的:
function foo<U>() { return function<T extends U>(target: any, propertyKey: any, descriptor: TypedPropertyDescriptor<() => T>){}; } class Bar { baz: number = 0; } class Baz { @foo<Bar>() // 本来应该合法,但现在报1241错误 @foo<null>() // 本来应该合法,但现在报1241错误 @foo<Bar | null>() // 这个是合法的,目前也确实没问题 @foo<number>() // 本来应该报错,现在确实报错了 qux(): Bar | null { return new Bar(); } }
我不想修改这个方法的返回类型,我猜这就是问题的关键。我只是想加个类型检查,确保U是被装饰方法返回类型的子集。
补充说明:我开启了experimentalDecorators实验性选项。
备注:内容来源于stack exchange,提问作者witrin
相关产品推荐
相关产品推荐

