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

16 浏览
0 Comments

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

我们的一个类中有一个典型的getter,假设如下:

class Employee implements IEmployee {
    private _fullName: string;
    get fullName(): string {
        return this._fullName;
    }
}

以及一个用于操作它的接口:

interface IEmployee{
    fullName: string; 
}

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

我看到过这个帖子,但是它相当旧了,我想知道现在有没有改进的地方。

0
0 Comments

TypeScript Interface中没有setter的属性会出现什么问题?出现问题的原因是什么?有哪些解决方法?

在TypeScript中,一个只有getter没有setter的属性不会产生编译错误,这与其他语言有一些微妙的不同。虽然在其他语言中,如果你试图设置一个只有getter的属性,编译器会报错,但在TypeScript中并不会。这是因为这个属性是只读的,无论你是否试图设置它,都不会有任何变化,设置操作会悄悄地失败。

以下是一个没有使用接口的示例:

class Example {
    get name() {
        return 'Steve';
    }
}
var y = new Example();
y.name = 'Example 2';
alert(y.name);

在这个示例中,当我使用`x.name = 'Example 2';`时,并没有编译器警告。

如果有编译器警告,我会预期在接口中有一种指定属性只读性的方式。但根据上述信息,你无法在接口中设置只读属性。

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);

这意味着你只能通过一个获取属性值的方法来强制只读性(并且显然不能设置方法)。

interface Test {
    getName: () => string;
}
class Example {
    getName() {
        return 'Steve';
    }
}
var x: Test = new Example();
alert(x.getName());
var y = new Example();
alert(y.getName());

只读性在缺少setter的情况下已经由JavaScript的行为基本得到了保证。问题在于它是默默地吞噬了值。理想的(并且希望会出现的)解决方法是允许TypeScript接口成员标记为只有getter或setter。另一种解决方法是,在缺少getter或setter的情况下,编译器生成空的getter和setter,以便简单地抛出错误(至少对于setter来说,这是我们整个团队预期的行为)。最后一种繁琐的解决方法是如果不需要实际的setter,就手动创建一个抛出错误的setter。

,只读性在缺少setter的情况下已经由JavaScript的行为得到了保证,但问题在于它是默默地吞噬了值。目前唯一的解决方法是使用方法来访问属性,以获得编译时的保证,确保没有设置操作。同时,已经在GitHub上提出了这个问题的issue:[github.com/Microsoft/TypeScript/issues/814](https://github.com/Microsoft/TypeScript/issues/814)。

0
0 Comments

TypeScript Interface signature for property without setter. 这个问题的出现原因是在 TypeScript 中,当定义接口的属性时,如果不指定 setter,那么该属性将被视为只读属性,不可更改。然而,有时我们可能希望定义一个只有 getter 的属性,而不提供 setter。这种情况下,如果我们只是简单地省略 setter,TypeScript 会报错。

解决这个问题的方法是在接口定义中使用 `readonly` 修饰符来标记属性为只读。通过使用 `readonly` 修饰符,我们可以确保该属性的值不会被修改。

下面是一个使用 `readonly` 修饰符定义只读属性的示例:

interface IEmployee{
    readonly fullName: string; 
}

在上面的示例中,`fullName` 属性被标记为只读属性,意味着它的值在初始化后不能再被修改。

通过使用 `readonly` 修饰符,我们可以确保只读属性的值不会在运行时被修改。这样可以提高代码的可靠性和可维护性,避免潜在的错误。

,TypeScript Interface signature for property without setter. 这个问题的解决方法是使用 `readonly` 修饰符来标记只读属性,以确保属性的值在初始化后不能被修改。这样可以提高代码的可靠性和可维护性。

0