【发布时间】:2018-12-04 04:22:35
【问题描述】:
我在 TypeScript 中有一些动态生成的函数名称。我现在可以使用它们的唯一方法是将我的对象转换为<any>。例如:<any>myInstance.getDataA()。这些函数是根据一些规则动态生成的。基于相同的规则,我想为我的classes 生成类型定义,但我无法让它工作。
original.ts
abstract class Original {
dynamics = ['getData', 'setData'];
constructor() {
// I create functions here dynamically
this.dynamics.forEach((key) => {
this[key + this.info] = () => null;
});
}
get info() {
return 'X';
}
}
my-class.ts
class MyClass extends Original {
get info() {
return 'A';
}
}
my-other-class.ts
class MyOtherClass extends Original {
get info() {
return 'B';
}
}
something.ts
const myInstance = new MyClass();
console.log(myInstance.getDataA()); // TS2339: Property getDataA does not exist on type: 'MyClass'
const myOtherInstance = new MyOtherClass();
console.log(myInstance.getDataB()); // TS2339: Property getDataB does not exist on type: 'MyClass'
我想自动生成一个定义文件来定义这些动态属性。
例如:
my-class.def.ts
declare interface MyClass {
getDataA;
setDataA
}
//my-other-class.def.ts
declare interface MyClass {
getDataB;
setDataB
}
但是我找不到我的定义文件的语法来使它工作。如果我不清楚,请问我,如果您有任何想法,请提供帮助!
【问题讨论】:
-
还有更多的属性吗?还是只有一个?因为只有一个人不值得麻烦..
-
有很多。我为示例保持简单
-
最大的问题是我们不能在映射类型中进行字符串操作,所以如果
getInfo返回一个字符串字面量类型A,我们就不能创建一个名为getDataA的属性 -
它确实有效,我有
getDataA函数,但如果我想调用它,我必须将我的实例转换为any。 -
我相信如果你转换为 any 它会起作用,我是说你不能在类型系统中执行这个突变
标签: javascript typescript types