分配Typescript构造函数参数

dem*_*emo 7 access-modifiers typescript

我有界面:

export interface IFieldValue {
    name: string;
    value: string;
}
Run Code Online (Sandbox Code Playgroud)

我有一个实现它的类:

class Person implements IFieldValue{
    name: string;
    value: string;
    constructor (name: string, value: string) {
        this.name = name;
        this.value = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

看完这篇文章后,我一直在考虑重构:

class Person implements IFieldValue{
    constructor(public name: string, public value: string) {
    }
}
Run Code Online (Sandbox Code Playgroud)

问题:在第一课中,我有一些字段,默认情况下应该是private.在第二个样本中,我只能将它们设置为public.这一切是正确的还是我对TypeScript中默认Access修饰符的理解?

Mac*_*uta 17

默认公开. TypeScript文档

在以下定义中

class Person implements IFieldValue{
    name: string;
    value: string;
    constructor (name: string, value: string) {
        this.name = name;
        this.value = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

属性<Person>.name<Person>.value默认是公共的.

因为他们在这里

class Person implements IFieldValue{
    constructor(public name: string, public value: string) {
        this.name = name;
        this.value = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:这是一种不正确的方法,因为this.name并且this.value将被视为未在构造函数中定义.

class Person implements IFieldValue{
    constructor(name: string, value: string) {
        this.name = name;
        this.value = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

要将这些属性设为私有,您需要将其重写为

class Person implements IFieldValue{
    private name: string;
    private value: string;
    constructor (name: string, value: string) {
        this.name = name;
        this.value = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

或者等价的

class Person implements IFieldValue{
    constructor (private name: string, private value: string) {}
}
Run Code Online (Sandbox Code Playgroud)

在我看来,这是避免冗余的最佳方式.

  • 如果 `Person` 实现了具有公共属性 'name' 和 'value' 的 `IFieldValue`,那么 `name` 和 `value` 必须在 `Person` 类中保持为 `public`。您提供的两个代码示例无法使用 TypeScript 2.x 进行编译。您可以更改界面并使道具私有,或者您可以拥有私有道具 `personName` 和 `personValue`,例如:`class Person implements IFieldValue{ private personName: string; 私人人值:字符串;构造函数(公共名称:字符串,公共值:字符串){ this.personName = name; this.personValue = 价值;} }` (2认同)