是否可以为方法修饰符选项提供类型安全 [英] Is it possible to provide type safety to method decorator options

查看:25
本文介绍了是否可以为方法修饰符选项提供类型安全的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我决定编写一些实用程序装饰符,如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中的类型脚本,没有明显的解决方案(除了手动指定泛型类型参数)。

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在其回调参数上被调用时,类型脚本会推断泛型类型,而不是等到返回的函数本身被调用。因此,当编译器实际知道T类型时,为时已晚,它已经无法正确推断。

我不知道除了继续手动指定参数之外,我是否还有其他建议,如果您认为它比前面提到的其他用例更有说服力,那么也许可以在TypeScrip中找到这个问题并给它一个👍,或者描述您的用例。祝你好运!

这篇关于是否可以为方法修饰符选项提供类型安全的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆