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

时间:2020-09-01 16:45:53

标签: typescript typescript-decorator vue-class-components

对于上下文,我在具有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仍然希望在类定义中键入该属性。

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

0 个答案:

没有答案