返回

基于其他类型的Typescript定义类方法名称

发布时间:2022-04-12 15:54:38 247
# es6

比如说,我有一堆类做类似的事情(例如,在这个例子中添加到一个集合中),但它们做的事情非常不同。手写出来的代码如下:

class Foo {
    fooSet: Set = new Set()
    addFoo(foo: string) {
        this.fooSet.add(foo)
    }
    delFoo(foo: string) {
        this.fooSet.delete(foo)
    }
    // Foo code
}

class Bar{
    barSet: Set = new Set()
    addBar(bar: string) {
        this.barSet.add(bar)
    }
    delBar(bar: string) {
        this.barSet.delete(bar)
    }
    // Bar code
}

那是许多无用的工作。相反,我想做一个函数namedSet(name: string)返回一个包含所有这些方法的类。我的第一次尝试是:

export const NamedSet = (name: N) => {
    const lowerName = name.toLowerCase() as Lowercase;
    const capitalName = name[0].toUpperCase() + name.substring(1) as Capitalize;


    return class  {
        private readonly [`${lowerName}Set`]: Set = new Set();

        [`add${capitalName}`](str: string): void {
            this[`${lowerName}Set`].add(str);
        }

        [`del${capitalName}`](str: string): void {
            this[`${lowerName}Set`].delete(str);
        }
    }
}

然而,这失败了,因为A computed property name in a class property declaration must have a simple literal type or a 'unique symbol' type.(集合初始化器)和Type '${Lowercase}集' cannot be used to index type 'this'.(在方法内部)如果类知道它有错误,我相信第二个错误将被修复${Lowercase}Set但是,TS不允许我用正常的JS方式定义它。这可能吗?如果可能,如何实现?

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(1)
按点赞数排序
用户头像