有没有办法从属性装饰器获取类型信息?

问题描述

对于上下文,我在具有Vue类组件的项目中使用TypeScript。我已经构建了一个属性装饰器,以从Vuex存储中提取状态并将其公开在组件属性中,如下所示:

export default class MyComponent extends Vue {
  ...

  @MapState(state => state.currentUser.uid)
  readonly currentUserId!: string;

  ...
}

TypeScript可以很好地确定state.currentUser.uidstring。太好了!

TypeScript似乎还要求我指定currentUserId属性string。可以,但是如果我将state.currentUser.uid的类型更改为string | null或类似UUID的类型该怎么办?除非我记得要寻找使用state.currentUser.uid个案例,否则TypeScript不会对此代码做任何事情,并以“类型安全”的方式传递给它!

是否有可能做一些花哨的代码来获得如下代码

@MapState(state => state.currentUser.uid)
readonly currentUserId!;

我希望TypeScript能够在上面查看我的mapper函数,并且像是“该函数返回一个string,所以此属性必须是string!”

我尝试过的东西

我想要this question寻找的东西的倒数。

根据this issue,这种反射可能不会出现很长时间了,至少对于类装饰器而言。

目前我的装饰器是这样定义的:

export default function<T>(map: (state: State) => T) {
  return function<C extends Vue>(target: C,key: string): void {
    createDecorator(function(componentOptions,k) {
      (componentOptions.computed || (componentOptions.computed = {}))[k] = function mappedState() {
        return map(store.state);
      };
    })(target,key);
  };
}

(其中C自定义组件的类型,T是我希望属性为的类型,key是我要包装的属性名称

我认为我可以扩展C{ [key]: T },但是TypeScript说:“ 找不到名称'key'。”,即使它确实从参数名称提取了“ key”,我尝试对currentUserId进行硬编码,而TypeScript仍然希望在类定义中键入该属性

那么...有什么想法吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)