我们的课程中有一个典型的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,但它已经很老了,我想知道,如果有任何改进的话。
答案 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;
}