我想要创建一个类型记录类RepeatLoader,它的任务是接受一个函数,该函数加载一些数据,并将在will循环中运行,直到回调检查某个条件是否为真为止。
目前的情况如下:
class RepeatLoader() {
loadDataFunc: () => void,
shouldLoadCallback: () => boolean
constructor(loadDataFunc, shouldLoadCallback) {
this.loadDataFunc = loadDataFunc;
this.shouldLoadCallback = shouldLoadCallback
}
startRunning() {
while(this.shouldLoadCallback()) {
this.loadDataFunc()
sleep(3000)
}
}
}
我希望能够将动态参数传递给loadDataFunc。类似于通过构造函数或startRunning函数传递的startRunning对象。
来自Python,这将是**kwargs的一个教科书示例。但我不知道如何在打字稿中这样做。有人有建议吗?
提前谢谢。
发布于 2022-03-13 00:25:31
你可以用仿制药
class RepeatLoader<A extends unknown[]> {
loadDataFunc: (...args: A) => void
shouldLoadCallback: () => boolean
constructor(loadDataFunc: (...args: A) => void, shouldLoadCallback: () => boolean) {
this.loadDataFunc = loadDataFunc
this.shouldLoadCallback = shouldLoadCallback
}
startRunning(...args: A) {
while (this.shouldLoadCallback()) {
this.loadDataFunc(...args)
sleep(3000)
}
}
}
// Usage:
const shouldLoadCallback = (): boolean => { /* ... */ }
const foo = new RepeatLoader(
(x: number, y: number) => console.log(x + y),
shouldLoadCallback
)
foo.startRunning(1, 2)
const bar = new RepeatLoader(
({x, y}: {x: number; y: number}) => console.log(x + y),
shouldLoadCallback
)
bar.startRunning({x: 1, y: 2})
A extends unknown[]
意味着A
需要某种数组,这允许我们执行(...args: A)
(...args: A)
就像Python的*args
**kwargs
的方法是执行类似于上面示例中的bar
的操作:使用单个对象参数如果只希望loadDataFunc
接受一个参数,则可以这样做:
class RepeatLoader<T> {
loadDataFunc: (arg: T) => void
shouldLoadCallback: () => boolean
constructor(loadDataFunc: (arg: T) => void, shouldLoadCallback: () => boolean) {
this.loadDataFunc = loadDataFunc
this.shouldLoadCallback = shouldLoadCallback
}
startRunning(arg: T) {
while (this.shouldLoadCallback()) {
this.loadDataFunc(arg)
sleep(3000)
}
}
}
但第一种方法更为普遍。
https://stackoverflow.com/questions/71437898
复制相似问题