我的声明文件有问题。我尝试为 openUi 框架编写 d.ts 文件。他们对其属性使用 get
在 JS 中我会有以下设置:
sap.ui.getCore().attachInit(function () {
var text = new sap.m.Text();
text.setText("Hello World!"); // sets the text property
text.placeAt("content", 0);
});
在 Typescript 中,我希望有这样的 getter 和 setter 语法:
var textcontrol = new sap.m.Text();
var textcontrol.Text = "Hello World"; // Sets the text property in typescript.
var text = textControl.Text; // Gets the text in typescript.
它应该在我的 JS 输出中编译为:
var textcontrol = new sap.m.Text();
var textcontrol.setText("Hello World"); // Sets the text property in typescript.
var text = textControl.getText(); // Gets the text in javascript.
当尝试在我的声明文件中声明该方法时,我收到错误,不允许在周围环境中声明 setter 或 getter。因此,我想这并不像我喜欢的那样工作(或者也许它确实有效,但我做得不对)。
在普通的 typescript 文件中,我可以使用 getter 和 setter
get Text(): string { return _text; };
set Text(value: string { _text = value };
但在 d.ts 文件中我不能。
是否可以在 d.ts 文件中声明该行为?
我能想到两个选择:
- 以某种方式根据我的定义创建一个内部模块并包装所有类以匹配 js 中的语法
- 不制作 d.ts 文件,而是制作实现虚拟返回值的普通 ts 文件,并且只会编译为所需的代码。
非常感谢您的帮助。
编辑:具体示例:
例如,我有这个JavaScript“类”来进行类型定义:
function Text() {}
Text.prototype.getText = function () {
return this.Text;
}
Text.prototype.setText = function (value) {
this.Text = value;
}
因此 JavaScript 中的用法是:
var testtext = new Text();
testtext.setText("Hello World");
alert(testtext.getText())
// alerts Hello World
我想为此创建一个声明文件并在 Typescript 中使用它,如下所示:
var testtext = new Text();
testtext.Text = "Hello World";
alert(testtext.Text);
这到底有可能吗?
最佳答案
Typescript 贡献者的回答:
https://github.com/Microsoft/TypeScript/issues/10969#issuecomment-248192537
这不可能!
d.ts 文件中的声明不会生成任何代码,因此,您不能通过编写声明来替换任何内容(显然)。
唯一的方法是使用如下属性声明来扩展 js 类:
var Text = ...<initializing code>...;
Object.defineProperty(Text.prototype, "Text", {
get: function () { return this.getText(); },
set: function (value) { this.setText(value); },
enumerable: true,
configurable: true
});
(对于像我这样的新手:您不必在构造函数方法中执行此操作。)
在 get 和 set 函数中只需调用 getter 和 setter 方法。这不会影响 JS 代码(至少不会影响我的代码),因此,如果调用过于频繁,则会影响转译后的 js 性能。
谢谢 Sohnee 的帮助。
关于typescript - typescript 声明文件中是否可以有 getter 和 setter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39534455/