没有setter的属性的TypeScript接口签名。

时间:2014-10-03 15:03:16

标签: properties interface typescript setter getter

我们的课程中有一个典型的getter,比如说

class Employee implements IEmployee {
    private _fullName: string;

    get fullName(): string {
        return this._fullName;
    }
}

以及使用它的界面

interface IEmployee{
     fullName: string; 
}

当通过此接口使用实例时,如果我们尝试分配给fullName,编译器将不会警告我们没有setter,并且JS运行时只是吞下任何赋值而不会抛出错误。有没有办法将接口成员标记为只有getter或者只有setter?

我已经看过this post,但它已经很老了,我想知道,如果有任何改进的话。

2 个答案:

答案 0 :(得分:1)

这是一个有趣的问题。 readonly属性的概念在TypeScript中与其他语言略有不同。

在许多语言中,如果您尝试设置属性,则带有getter(但没有setter)的属性会引发编译器错误,但TypeScript不会。

该属性仍然是只读的,因为如果你试图设置它没有任何区别;该集将无声地失败。

以下是没有任何接口的示例:

class Example {
    get name() {
        return 'Steve';
    }
}

var y = new Example();
y.name = 'Example 2';
alert(y.name);

使用x.name = 'Example 2';时没有编译器警告。

如果编译器警告,我随后会希望有一种方法来指定接口中属性的readonly-ness。正如您所期望的那样,根据上述信息,您无法在界面上设置只读属性。

interface Test {
    name: string;
}

class Example {
    get name() {
        return 'Steve';
    }
}

var x: Test = new Example();
x.name = 'Example 1';
alert(x.name);

var y = new Example();
x.name = 'Example 2';
alert(x.name);

这意味着你只能通过一个获取属性值的方法强制执行readonly-ness(显然没有允许设置它的方法)。

interface Test {
    getName: () => string;
}

class Example {
    getName() {
        return 'Steve';
    }
}

var x: Test = new Example();
//x.getName('Obviously not');
//x.getName() = 'Obviously not';
alert(x.getName());

var y = new Example();
//y.getName('Obviously not');
//y.getName() = 'Obviously not';
alert(y.getName());

答案 1 :(得分:0)

打字稿中的属性现在可以具有“只读”修饰符,以实现所需的休止符。

interface IEmployee{
    readonly fullName: string; 
}