是否有可能在打字稿声明文件中有getter和setter?

时间:2016-09-16 14:53:21

标签: typescript declaration

我的声明文件有问题。我尝试为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文件中声明该行为?

我可以想到两个选项:

  1. 以某种方式从我的定义中创建一个内部模块,并将所有类包装起来以匹配js
  2. 中的语法
  3. 不创建d.ts文件,但是实现虚拟返回值的普通ts文件只会编译为所需的代码。
  4. 非常感谢帮助。

    编辑:一个具体的例子:

    我举例说明 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);
    

    毕竟这可能吗?

2 个答案:

答案 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;
}