【发布时间】:2020-05-02 02:48:50
【问题描述】:
我想创建一个结构,其中我有这样的接口:
interface PageData {
data: (this: Page) => object;
methods: (this: Page) => { [methodName: string]: () => any };
main: (this: Page) => void;
}
以及使用此数据创建新实例的类:
class Page {
name: string;
data: object;
methods: object;
constructor(name: string, data: PageData) {
this.name = name;
this.data = data.data.call(this);
this.methods = data.methods.call(this);
data.main.call(this);
}
}
现在如何将数据和方法函数的 ReturnType 传递给 Page.data 和 Page.methods?我搜索了 ReturnType、Generics 等,此时我很困惑。也许它甚至不可能?我想拥有这个接口,这样我就可以在许多文件中使用它。我的文件夹结构类似于:
src/
src/main.ts
src/Page.ts
src/pages/demo.ts
在 demo.ts 中,我想用 PageData 接口导出一个对象:
export default {
data: function() {
return {
customName: this.name + "demo"
}
},
methods: function() {
return {
doSomething: () => this.data.customName.repeat(2)
}
},
main: function() {
console.log(this.data.customName);
console.log(this.methods.doSomething());
}
} as PageData
在 main.ts 中,我会使用 require 获取数据。喜欢new Page("demo", require("src/pages/demo.ts"))。
我试图找到任何类似于我正在尝试做的示例,但我找不到任何东西。我发现的唯一东西是如何获取函数的 ReturnType,而不是使用接口的对象中的函数。
这个完整的例子有三个错误:
27、31行:Property 'customName' does not exist on type 'object'.
第32行:Property 'doSomething' does not exist on type 'object'.
interface PageData {
data: (this: Page) => object;
methods: (this: Page) => { [methodName: string]: () => any };
main: (this: Page) => void;
}
class Page {
name: string;
data: object;
methods: object;
constructor(name: string, data: PageData) {
this.name = name;
this.data = data.data.call(this);
this.methods = data.methods.call(this);
data.main.call(this);
}
}
export default {
data: function() {
return {
customName: this.name + "demo"
}
},
methods: function() {
return {
doSomething: () => this.data.customName.repeat(2)
}
},
main: function() {
console.log(this.data.customName);
console.log(this.methods.doSomething());
}
} as PageData
【问题讨论】:
-
我不太了解您所说的“将数据和方法函数的 ReturnType 传递给 Page.data 和 Page.methods”是什么意思。我建议通过准确显示没有按预期工作的内容来将您的代码变成minimal reproducible example(例如,当您尝试访问由
new Page()...创建的Page实例上的属性时出现错误消息?)运气! -
我添加了更多信息并修复了默认方法和主要功能中的错误。
-
如果我修复了这些错误,您希望
const page = new Page("demo", require("src/pages/demo.ts"))能做什么?你希望它记住page.data.customName的存在吗?或者你认为page.data是object,就像你对Page的定义一样? -
您的实现将按原样抛出运行时错误,因为
Page构造函数不会将实际的data或method属性复制到this。因此,当您运行它时,this.customName和this.doSomething将未定义,从而导致main调用内部出现错误。你能解决这个问题吗? -
是的,我希望它记住
page.data.customName的存在。我已经将this.customName更改为this.data.customName,也许您需要重新加载浏览器?
标签: typescript class types typescript-generics