首页 > 解决方案 > 如何将枚举键中的方法添加到 Typescript 中的类?

问题描述

我正在将现有代码重写为 TS 并得到这样一个问题:

enum MyEnum { foo = ‘foo’ }

class MyClass {
  // how to add methods declarations here?
}

for (let name in MyEnum)
  MyClass.prototype[name] = () => console.log(MyEnum[name])

const a = new MyClass()
a.foo() // outputs "foo"

所有方法都应具有相同的签名。

这正是我想要做的事情:它是一个用于数据库迁移的包(https://www.npmjs.com/package/rake-db),我正在将它重写为打字稿。

示例用法:

exports.change = (db, up) => {
  db.createTable('entities', (t) => {
    t.text('name')
    t.float('floatColumn') // here is where this enum is needed
    t.timestamps()
  })
}

我有将常见类型映射到特定数据库的枚举:

export type ColumnTypes {
  integer = 'integer', // the same
  float = 'float8', // different
  etc = 'etc',
}

我有向数据库添加列的类:

class Table {
  column(name: string, type: string, options: ColumnOptions) {}
}

我希望它具有键入的列方法,例如:

class Table {
  column(name: string, type: string, options: ColumnOptions) {}

  integer(name: string, options: ColumnOptions) {
    this.column(name, ColumnTypes.integer, options)
  }

  // and other method
}

我想从枚举动态添加方法的原因是,通过复制粘贴,该类中需要多行代码,如果我要向枚举添加新类型,我必须记住向类添加相应的方法。

标签: typescript

解决方案


如果所有方法都相同,则此解决方案有效

enum MyEnum {
  foo = 'foo',
  test = 'test',
}

type TMyClass = {
  [key in MyEnum]: () => void;
}

class MyClass { }

for (let name in MyEnum) {
  MyClass.prototype[name] = () => console.log(MyEnum[name])
}

const a: TMyClass = new MyClass() as any;

a.foo();
a.test();

推荐阅读