首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >相当于打字稿中的kwargs

相当于打字稿中的kwargs
EN

Stack Overflow用户
提问于 2022-03-11 11:34:00
回答 1查看 285关注 0票数 0

我想要创建一个类型记录类RepeatLoader,它的任务是接受一个函数,该函数加载一些数据,并将在will循环中运行,直到回调检查某个条件是否为真为止。

目前的情况如下:

代码语言:javascript
代码运行次数:0
运行
复制
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的一个教科书示例。但我不知道如何在打字稿中这样做。有人有建议吗?

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-13 08:25:31

你可以用仿制药

代码语言:javascript
代码运行次数:0
运行
复制
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
  • 最接近Python的**kwargs的方法是执行类似于上面示例中的bar的操作:使用单个对象参数

如果只希望loadDataFunc接受一个参数,则可以这样做:

代码语言:javascript
代码运行次数:0
运行
复制
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)
        }
    }
}

但第一种方法更为普遍。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71437898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档