对于上下文,我在具有Vue类组件的项目中使用TypeScript。我已经构建了一个属性装饰器,以从Vuex存储中提取状态并将其公开在组件属性中,如下所示:
export default class MyComponent extends Vue {
...
@MapState(state => state.currentUser.uid)
readonly currentUserId!: string;
...
}
TypeScript可以很好地确定state.currentUser.uid
是string
。太好了!
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仍然希望在类定义中键入该属性。
那么...有什么想法吗?