我的声明文件有问题。我尝试为openUi框架编写d.ts文件。他们使用get< propname>()并为其属性设置< propname>(var)语法。
在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。因此,我想这不起作用,因为我喜欢(或者它可能,但我做得不对。)
在普通的打字稿文件中,我可以使用getter和setter
get Text(): string { return _text; };
set Text(value: string { _text = value };
但在d.ts文件中我不能。
是否有可能在d.ts文件中声明该行为?
我可以想到两个选项:
非常感谢帮助。
我举例说明 JavaScript “class”为类型定义:
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);
毕竟这可能吗?
答案 0 :(得分:1)
来自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的帮助。
答案 1 :(得分:0)
如果你有一个带有getter和setter的属性,声明就像这样简单:
declare class Test {
Text: string;
}
var x: Test;
x.Text = 'hello world';
类型定义中的语法与接口相同,因此Text: string
就是您所需要的。
如果您只需要一个getter或setter,那么该功能就会传入 - the readonly
keyword which is in TypeScript 2.0
declare class Test {
readonly Text: string;
}
...或the ability to use get
and set
keywords in interfaces。
declare class Test {
get Text(): string;
}
您还可以描述获取设置支持属性的方法。它们与普通方法没有什么不同:
declare class Test {
setText(v: string): void;
getText(): string;
}