typescript - typescript 声明文件中是否可以有 getter 和 setter?

标签 typescript declaration

我的声明文件有问题。我尝试为 openUi 框架编写 d.ts 文件。他们对其属性使用 get() 和 set(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。因此,我想这并不像我喜欢的那样工作(或者也许它确实有效,但我做得不对)。

在普通的 typescript 文件中,我可以使用 getter 和 setter

get Text(): string { return _text; };
set Text(value: string { _text = value };

但在 d.ts 文件中我不能。

是否可以在 d.ts 文件中声明该行为?

我能想到两个选择:

  1. 以某种方式根据我的定义创建一个内部模块并包装所有类以匹配 js 中的语法
  2. 不制作 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/

相关文章:

javascript - 文档请求 - Javascript

c++ - C++类构造函数中 "inline"的理解?

ReactJS 和 Typescript useContext - 类型上不存在属性

调试器忽略了 TypeScript toString

angular - 如何以 Angular Testing 以下异步函数?

c - 枚举常量声明与定义 - C 标准

c - 函数参数列表后的变量声明

C Puzzle - 玩类型

node.js - Angular 6 - 请求的资源上不存在 'Access-Control-Allow-Origin' header

typescript - 如何使用 typescript 中的查找来推断类型化的 mapValues?