typescript - 如何将枚举键中的方法添加到 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
}
我想从枚举动态添加方法的原因是,通过复制粘贴,该类中需要多行代码,如果我要向枚举添加新类型,我必须记住向类添加相应的方法。
解决方案
如果所有方法都相同,则此解决方案有效
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();
推荐阅读
- c# - 以编程方式打开 exe 文件时用户名或密码不正确
- delphi - 使用按钮 OnClick 将值输入到 TEdit
- border - iOS 图表 - 条形阴影边框
- jira - 使用nodejs从atlassian连接应用程序插件调用jira cloud api时出现问题
- ubuntu - Can I delete events.out.tfevents.XXXXXXXXXX.computer_name files from training folder
- mongodb - Remove mongodb array keys except first index
- sql - Count Distinct over partition by sql
- wordpress - 在 Instagram 上分享 + 本地主机分享
- angular - 通过在Angular 6中设置环境变量的动态网址?
- c++ - 通过调用 glDrawElements() 绘制很多三角形变得很慢?