我正在尝试构建一个在构造函数阶段构建一些动态方法的类,一切正常,但是VS Code自动建议不适用于动态方法?我们应该怎么做? 这是codeSandBox
我也尝试过interface
,但还是没有运气
export default class A {
private version = 1;
get getVersion() {
return this.version;
}
private actions = ["approve", "edit", "delete"];
constructor() {
this.actions.forEach(
method =>
(A.prototype[method] = route => {
console.warn(method + " called");
})
);
}
}
const B = new A();
console.warn(B.getVersion);
console.warn(B.approve()) // auto suggestion not available here
答案 0 :(得分:0)
您可以执行此操作……但这确实很hacky。这样的元编程不可能完全进行类型检查。这是此解决方案的playground。
首先,告诉TS动作是一个常量数组,以便可以缩小类型。
private actions = ["approve", "edit", "delete"] as const;
下一步,创建一个映射类型,该类型描述您的forEach
方法添加到该类型的内容。
type _A = {
[K in A['actions'][number]]: (route: string) => void
}
请注意,它必须是type
。不能是interface
。
最后,添加一个扩展此类型别名的接口。我希望TS在这里对圆形性大喊大叫,但是显然这是可以的。
export default interface A extends _A {
}